Skip to content

Commit

Permalink
fix: added missing unnamed node traversal handling
Browse files Browse the repository at this point in the history
  • Loading branch information
SpontanCombust committed Aug 29, 2024
1 parent 1de643a commit 11c9d7d
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -761,6 +761,7 @@ impl SyntaxNodeVisitor for SyntaxErrorVisitor<'_> {

NewExpressionTraversalPolicy {
traverse_lifetime_obj,
traverse_unnamed: any_error,
traverse_errors: any_error
}
}
Expand Down Expand Up @@ -833,6 +834,7 @@ impl SyntaxNodeVisitor for SyntaxErrorVisitor<'_> {

TypeCastExpressionTraversalPolicy {
traverse_value,
traverse_unnamed: any_error,
traverse_errors: any_error
}
}
Expand Down
43 changes: 36 additions & 7 deletions crates/core/src/ast/expressions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -356,14 +356,34 @@ impl<'script> FunctionCallArgumentsNode<'script> {
}

fn accept_with_policy<V: SyntaxNodeVisitor>(&self, visitor: &mut V, ctx: &mut TraversalContextStack, tp: FunctionCallExpressionTraversalPolicy) {
//FIXME missing unnamed traversal
for res in self.iter_result() {
match res {
Ok(arg) => {
arg.accept(visitor, ctx)
}
let mut previous_was_comma = true;

for ch in self.children_detailed().must_be_named(false) {
match ch {
Ok((arg, _)) if arg.is_named() => {
let arg = FunctionCallArgument::Some(arg.unsafe_into());
arg.accept(visitor, ctx);

previous_was_comma = false;
},
// comma is the only valid unnamed token in thi s context
Ok((comma, _)) if !comma.is_named() => {
if previous_was_comma {
let arg = FunctionCallArgument::Omitted(comma.range());
arg.accept(visitor, ctx);
}

previous_was_comma = true;

if tp.traverse_unnamed {
let unnamed: UnnamedNode = comma.unsafe_into();
unnamed.accept(visitor, ctx);
}
},
Err(e) if tp.traverse_errors => {
e.accept(visitor, ctx)
e.accept(visitor, ctx);

previous_was_comma = false;
},
_ => {}
}
Expand Down Expand Up @@ -394,6 +414,7 @@ impl<'script> TryFrom<AnyNode<'script>> for FunctionCallArgumentsNode<'script> {

impl SyntaxNodeTraversal for FunctionCallArgumentsNode<'_> {
fn accept<V: SyntaxNodeVisitor>(&self, visitor: &mut V, ctx: &mut TraversalContextStack) {
// UNUSED
self.iter().for_each(|n| n.accept(visitor, ctx))
}
}
Expand Down Expand Up @@ -657,6 +678,10 @@ impl SyntaxNodeTraversal for NewExpressionNode<'_> {
lifetime_obj.accept(visitor, ctx);
ctx.pop();
},
Ok((unnamed, _)) if !unnamed.is_named() && tp.traverse_unnamed => {
let unnamed: UnnamedNode = unnamed.unsafe_into();
unnamed.accept(visitor, ctx);
}
Err(e) if tp.traverse_errors => {
e.accept(visitor, ctx);
},
Expand Down Expand Up @@ -726,6 +751,10 @@ impl SyntaxNodeTraversal for TypeCastExpressionNode<'_> {
value.accept(visitor, ctx);
ctx.pop();
},
Ok((unnamed, _)) if !unnamed.is_named() && tp.traverse_unnamed => {
let unnamed: UnnamedNode = unnamed.unsafe_into();
unnamed.accept(visitor, ctx);
}
Err(e) if tp.traverse_errors => {
e.accept(visitor, ctx);
},
Expand Down
14 changes: 8 additions & 6 deletions crates/core/src/ast/functions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ impl SyntaxNodeTraversal for EventDeclarationNode<'_> {
Ok((params, Some("params"))) if tp.traverse_params => {
let params: FunctionParametersNode = params.unsafe_into();

params.accept_with_policy(visitor, ctx, tp.traverse_errors);
params.accept_with_policy(visitor, ctx, tp.traverse_unnamed, tp.traverse_errors);
},
Ok((rt, Some("return_type"))) if tp.traverse_return_type => {
let rt: TypeAnnotationNode = rt.unsafe_into();
Expand Down Expand Up @@ -179,7 +179,7 @@ impl SyntaxNodeTraversal for FunctionDeclarationNode<'_> {
Ok((params, Some("params"))) if tp.traverse_params => {
let params: FunctionParametersNode = params.unsafe_into();

params.accept_with_policy(visitor, ctx, tp.traverse_errors);
params.accept_with_policy(visitor, ctx, tp.traverse_unnamed, tp.traverse_errors);
},
Ok((rt, Some("return_type"))) if tp.traverse_return_type => {
let rt: TypeAnnotationNode = rt.unsafe_into();
Expand Down Expand Up @@ -375,15 +375,17 @@ impl<'script> FunctionParametersNode<'script> {
}


fn accept_with_policy<V: SyntaxNodeVisitor>(&self, visitor: &mut V, ctx: &mut TraversalContextStack, traverse_errors: bool) {
//FIXME missing unnamed traversal
fn accept_with_policy<V: SyntaxNodeVisitor>(&self, visitor: &mut V, ctx: &mut TraversalContextStack, traverse_unnamed: bool, traverse_errors: bool) {
for ch in self.children_detailed().must_be_named(true) {
match ch {
Ok((param_group, _)) => {
Ok((param_group, _)) if param_group.is_named() => {
let param_group: FunctionParameterGroupNode = param_group.unsafe_into();

param_group.accept(visitor, ctx);
},
Ok((unnamed, _)) if !unnamed.is_named() && traverse_unnamed => {
let unnamed: UnnamedNode = unnamed.unsafe_into();
unnamed.accept(visitor, ctx);
},
Err(e) if traverse_errors => {
e.accept(visitor, ctx);
},
Expand Down
2 changes: 2 additions & 0 deletions crates/core/src/ast/traversal/policies.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,13 @@ traversal_policy!(MemberFieldExpressionTraversalPolicy,

traversal_policy!(NewExpressionTraversalPolicy,
traverse_lifetime_obj,
traverse_unnamed,
traverse_errors
);

traversal_policy!(TypeCastExpressionTraversalPolicy,
traverse_value,
traverse_unnamed,
traverse_errors
);

Expand Down

0 comments on commit 11c9d7d

Please sign in to comment.