Skip to content

Commit

Permalink
Added TypeAnnotationNode traversal
Browse files Browse the repository at this point in the history
  • Loading branch information
SpontanCombust committed Aug 15, 2024
1 parent 2690fd7 commit 3ff05ed
Show file tree
Hide file tree
Showing 10 changed files with 100 additions and 0 deletions.
4 changes: 4 additions & 0 deletions crates/analysis/src/jobs/scan_symbols.rs
Original file line number Diff line number Diff line change
Expand Up @@ -545,6 +545,7 @@ impl SyntaxNodeVisitor for SymbolScannerVisitor<'_> {
FunctionDeclarationTraversalPolicy {
traverse_annotation: false,
traverse_params: traverse,
traverse_return_type: false,
traverse_definition: traverse,
traverse_errors: false
}
Expand Down Expand Up @@ -625,6 +626,7 @@ impl SyntaxNodeVisitor for SymbolScannerVisitor<'_> {
FunctionDeclarationTraversalPolicy {
traverse_annotation: false,
traverse_params: traverse,
traverse_return_type: false,
traverse_definition: traverse,
traverse_errors: false
}
Expand Down Expand Up @@ -660,6 +662,7 @@ impl SyntaxNodeVisitor for SymbolScannerVisitor<'_> {

EventDeclarationTraversalPolicy {
traverse_params: traverse,
traverse_return_type: false,
traverse_definition: traverse,
traverse_errors: false
}
Expand Down Expand Up @@ -797,6 +800,7 @@ impl SyntaxNodeVisitor for SymbolScannerVisitor<'_> {
}

VarDeclarationTraversalPolicy {
traverse_type: false,
traverse_init_value: false,
traverse_errors: false
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -456,6 +456,7 @@ impl SyntaxNodeVisitor for ContextualSyntaxAnalysis<'_> {

VarDeclarationTraversalPolicy {
traverse_init_value: false,
traverse_type: false,
traverse_errors: false
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,7 @@ impl SyntaxNodeVisitor for SyntaxErrorVisitor<'_> {

FunctionDeclarationTraversalPolicy {
traverse_annotation: false,
traverse_return_type: false,
traverse_params,
traverse_definition,
traverse_errors: false
Expand Down Expand Up @@ -395,6 +396,7 @@ impl SyntaxNodeVisitor for SyntaxErrorVisitor<'_> {

FunctionDeclarationTraversalPolicy {
traverse_annotation: false,
traverse_return_type: false,
traverse_params,
traverse_definition,
traverse_errors: false
Expand Down Expand Up @@ -430,6 +432,7 @@ impl SyntaxNodeVisitor for SyntaxErrorVisitor<'_> {

EventDeclarationTraversalPolicy {
traverse_params,
traverse_return_type: false,
traverse_definition,
traverse_errors: false
}
Expand Down Expand Up @@ -492,6 +495,7 @@ impl SyntaxNodeVisitor for SyntaxErrorVisitor<'_> {
}

VarDeclarationTraversalPolicy {
traverse_type: false,
traverse_init_value,
traverse_errors: false
}
Expand Down
4 changes: 4 additions & 0 deletions crates/core/src/ast/annotation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@ impl SyntaxNodeTraversal for AnnotationNode<'_> {
let tp = visitor.visit_annotation(self, ctx);

if tp.any() {
ctx.push(TraversalContext::Annotation);

for ch in self.children_detailed().must_be_named(true) {
match ch {
Err(e) if tp.traverse_errors => {
Expand All @@ -92,6 +94,8 @@ impl SyntaxNodeTraversal for AnnotationNode<'_> {
_ => {}
}
}

ctx.pop();
}

visitor.exit_annotation(self, ctx);
Expand Down
15 changes: 15 additions & 0 deletions crates/core/src/ast/functions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,11 @@ impl SyntaxNodeTraversal for EventDeclarationNode<'_> {

params.accept_with_policy(visitor, ctx, tp.traverse_errors);
},
Ok((rt, Some("return_type"))) if tp.traverse_return_type => {
let rt: TypeAnnotationNode = rt.unsafe_into();

rt.accept(visitor, ctx);
},
Ok((def, Some("definition"))) if tp.traverse_definition => {
let def: FunctionDefinitionNode = def.unsafe_into();

Expand Down Expand Up @@ -172,6 +177,11 @@ impl SyntaxNodeTraversal for FunctionDeclarationNode<'_> {

params.accept_with_policy(visitor, ctx, tp.traverse_errors);
},
Ok((rt, Some("return_type"))) if tp.traverse_return_type => {
let rt: TypeAnnotationNode = rt.unsafe_into();

rt.accept(visitor, ctx);
},
Ok((def, Some("definition"))) if tp.traverse_definition => {
let def: FunctionDefinitionNode = def.unsafe_into();

Expand Down Expand Up @@ -450,6 +460,11 @@ impl SyntaxNodeTraversal for FunctionParameterGroupNode<'_> {
if tp.any() {
for ch in self.children_detailed().must_be_named(true) {
match ch {
Ok((typ, Some("param_type"))) if tp.traverse_type => {
let typ: TypeAnnotationNode = typ.unsafe_into();

typ.accept(visitor, ctx);
},
Err(e) if tp.traverse_errors => {
e.accept(visitor, ctx);
},
Expand Down
3 changes: 3 additions & 0 deletions crates/core/src/ast/traversal/contexts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ pub enum TraversalContext {
TernaryConditionalExpressionAlt,
ArrayInitializerExpression,

TypeAnnotation,
Annotation,

Error
}

Expand Down
11 changes: 11 additions & 0 deletions crates/core/src/ast/traversal/policies.rs
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ traversal_policy!(EnumVariantDeclarationTraversalPolicy,

traversal_policy!(MemberVarDeclarationTraversalPolicy,
traverse_annotation,
traverse_type,
traverse_errors
);

Expand All @@ -164,22 +165,26 @@ traversal_policy!(MemberHintTraversalPolicy,
);

traversal_policy!(AutobindDeclarationTraversalPolicy,
traverse_type,
traverse_errors
);

traversal_policy!(FunctionParameterGroupTraversalPolicy,
traverse_type,
traverse_errors
);

traversal_policy!(FunctionDeclarationTraversalPolicy,
traverse_annotation,
traverse_params,
traverse_return_type,
traverse_definition,
traverse_errors
);

traversal_policy!(EventDeclarationTraversalPolicy,
traverse_params,
traverse_return_type,
traverse_definition,
traverse_errors
);
Expand Down Expand Up @@ -242,6 +247,7 @@ traversal_policy!(CompoundStatementTraversalPolicy,
);

traversal_policy!(VarDeclarationTraversalPolicy,
traverse_type,
traverse_init_value,
traverse_errors
);
Expand All @@ -263,6 +269,11 @@ traversal_policy!(DeleteStatementTraversalPolicy,



traversal_policy!(TypeAnnotationTraversalPolicy,
traverse_type_arg,
traverse_errors
);

traversal_policy!(AnnotationTraversalPolicy,
traverse_errors
);
Expand Down
5 changes: 5 additions & 0 deletions crates/core/src/ast/traversal/visitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,11 @@ pub trait SyntaxNodeVisitor {
fn visit_nop_stmt(&mut self, n: &NopNode, ctx: &TraversalContextStack) {}


/// Called when visiting a type annotation node
fn visit_type_annotation(&mut self, n: &TypeAnnotationNode, ctx: &TraversalContextStack) -> TypeAnnotationTraversalPolicy { TraversalPolicy::default_to(self.traversal_policy_default()) }
/// Called after visiting a type annotation node and possibly also children nodes specified in traversal policy.
fn exit_type_annotation(&mut self, n: &TypeAnnotationNode, ctx: &TraversalContextStack) {}

/// Called when visiting an annotation node (e.g. @wrapMethod)
fn visit_annotation(&mut self, n: &AnnotationNode, ctx: &TraversalContextStack) -> AnnotationTraversalPolicy { TraversalPolicy::default_to(self.traversal_policy_default()) }
/// Called after visiting an annotation node and possibly also children nodes specified in traversal policy.
Expand Down
10 changes: 10 additions & 0 deletions crates/core/src/ast/traversal/visitor_chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -560,6 +560,16 @@ impl<'a> SyntaxNodeVisitor for SyntaxNodeVisitorChain<'a> {
}


#[inline]
fn visit_type_annotation(&mut self, n: &TypeAnnotationNode, ctx: &TraversalContextStack) -> TypeAnnotationTraversalPolicy {
self.chain_visit_traversable(move |link| link.visit_type_annotation(n, ctx))
}

#[inline]
fn exit_type_annotation(&mut self, n: &TypeAnnotationNode, ctx: &TraversalContextStack) {
self.chain_exit(move |link| link.exit_type_annotation(n, ctx))
}

#[inline]
fn visit_annotation(&mut self, n: &AnnotationNode, ctx: &TraversalContextStack) -> AnnotationTraversalPolicy {
self.chain_visit_traversable(move |link| link.visit_annotation(n, ctx))
Expand Down
43 changes: 43 additions & 0 deletions crates/core/src/ast/vars.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,34 @@ impl<'script> TryFrom<AnyNode<'script>> for TypeAnnotationNode<'script> {
}
}

impl SyntaxNodeTraversal for TypeAnnotationNode<'_> {
fn accept<V: SyntaxNodeVisitor>(&self, visitor: &mut V, ctx: &mut TraversalContextStack) {
let tp = visitor.visit_type_annotation(self, ctx);

if tp.any() {
ctx.push(TraversalContext::TypeAnnotation);

for ch in self.children_detailed().must_be_named(true) {
match ch {
Ok((type_arg, Some("type_arg"))) if tp.traverse_type_arg => {
let type_arg: TypeAnnotationNode = type_arg.unsafe_into();

type_arg.accept(visitor, ctx);
},
Err(e) if tp.traverse_errors => {
e.accept(visitor, ctx);
},
_ => {}
}
}

ctx.pop();
}

visitor.exit_type_annotation(self, ctx);
}
}



pub type LocalVarDeclarationNode<'script> = SyntaxNode<'script, tags::LocalVarDeclaration>;
Expand Down Expand Up @@ -100,6 +128,11 @@ impl SyntaxNodeTraversal for LocalVarDeclarationNode<'_> {
if tp.any() {
for ch in self.children_detailed().must_be_named(true) {
match ch {
Ok((typ, Some("var_type"))) if tp.traverse_type => {
let typ: TypeAnnotationNode = typ.unsafe_into();

typ.accept(visitor, ctx);
},
Ok((init_value, Some("init_value"))) if tp.traverse_init_value => {
let init_value: ExpressionNode = init_value.unsafe_into();

Expand Down Expand Up @@ -179,6 +212,11 @@ impl SyntaxNodeTraversal for MemberVarDeclarationNode<'_> {

annot.accept(visitor, ctx);
},
Ok((typ, Some("var_type"))) if tp.traverse_type => {
let typ: TypeAnnotationNode = typ.unsafe_into();

typ.accept(visitor, ctx);
},
Err(e) if tp.traverse_errors => {
e.accept(visitor, ctx);
},
Expand Down Expand Up @@ -265,6 +303,11 @@ impl SyntaxNodeTraversal for AutobindDeclarationNode<'_> {
if tp.any() {
for ch in self.children_detailed().must_be_named(true) {
match ch {
Ok((typ, Some("autobind_type"))) if tp.traverse_type => {
let typ: TypeAnnotationNode = typ.unsafe_into();

typ.accept(visitor, ctx);
},
Err(e) => {
e.accept(visitor, ctx)
},
Expand Down

0 comments on commit 3ff05ed

Please sign in to comment.