From adc9194b45aaad97a06e85ad2f173d461d4d3d37 Mon Sep 17 00:00:00 2001 From: Sergei Zharinov Date: Mon, 15 Dec 2025 23:12:28 -0300 Subject: [PATCH] Refactor AST casting to use `can_cast` --- crates/plotnik-lib/src/parser/ast.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/crates/plotnik-lib/src/parser/ast.rs b/crates/plotnik-lib/src/parser/ast.rs index 680d2889..1f482147 100644 --- a/crates/plotnik-lib/src/parser/ast.rs +++ b/crates/plotnik-lib/src/parser/ast.rs @@ -30,7 +30,11 @@ macro_rules! ast_node { impl $name { pub fn cast(node: SyntaxNode) -> Option { - (node.kind() == SyntaxKind::$kind).then(|| Self(node)) + Self::can_cast(node.kind()).then(|| Self(node)) + } + + pub fn can_cast(kind: SyntaxKind) -> bool { + kind == SyntaxKind::$kind } pub fn as_cst(&self) -> &SyntaxNode { @@ -54,7 +58,8 @@ macro_rules! define_expr { impl Expr { pub fn cast(node: SyntaxNode) -> Option { - $(if let Some(n) = $variant::cast(node.clone()) { return Some(Expr::$variant(n)); })+ + let kind = node.kind(); + $(if $variant::can_cast(kind) { return Some(Expr::$variant($variant(node))); })+ None } @@ -138,7 +143,11 @@ pub struct AnonymousNode(SyntaxNode); impl AnonymousNode { pub fn cast(node: SyntaxNode) -> Option { - matches!(node.kind(), SyntaxKind::Str | SyntaxKind::Wildcard).then(|| Self(node)) + Self::can_cast(node.kind()).then(|| Self(node)) + } + + pub fn can_cast(kind: SyntaxKind) -> bool { + matches!(kind, SyntaxKind::Str | SyntaxKind::Wildcard) } pub fn as_cst(&self) -> &SyntaxNode {