Skip to content

Commit

Permalink
Added new visitor functions and policies for traversing errors
Browse files Browse the repository at this point in the history
  • Loading branch information
SpontanCombust committed Aug 12, 2024
1 parent 3a5c7a2 commit 33aebc8
Show file tree
Hide file tree
Showing 9 changed files with 410 additions and 71 deletions.
24 changes: 17 additions & 7 deletions crates/analysis/src/jobs/scan_symbols.rs
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,7 @@ impl SyntaxNodeVisitor for SymbolScannerVisitor<'_> {
}
}

fn visit_enum_variant_decl(&mut self, n: &EnumVariantDeclarationNode) {
fn visit_enum_variant_decl(&mut self, n: &EnumVariantDeclarationNode) -> EnumVariantDeclarationTraversalPolicy {
let name_node = n.name();
let enum_variant_name = name_node.value(&self.doc);
let path = GlobalDataSymbolPath::new(&enum_variant_name);
Expand Down Expand Up @@ -463,6 +463,8 @@ impl SyntaxNodeVisitor for SymbolScannerVisitor<'_> {

self.symtab.insert_primary_symbol(sym);
}

TraversalPolicy::default_to(false)
}

fn visit_global_func_decl(&mut self, n: &FunctionDeclarationNode) -> FunctionDeclarationTraversalPolicy {
Expand Down Expand Up @@ -554,13 +556,13 @@ impl SyntaxNodeVisitor for SymbolScannerVisitor<'_> {
}
}

fn visit_global_var_decl(&mut self, n: &MemberVarDeclarationNode) {
fn visit_global_var_decl(&mut self, n: &MemberVarDeclarationNode) -> MemberVarDeclarationTraversalPolicy {
if let Some(annotation) = n.annotation() {
// leave early if not appropriate annotation
match AnnotationKind::from_str(&annotation.name().value(self.doc)) {
Ok(AnnotationKind::AddField) => {},
_ => {
return;
return TraversalPolicy::default_to(false);
}
}

Expand All @@ -569,7 +571,7 @@ impl SyntaxNodeVisitor for SymbolScannerVisitor<'_> {
if let Some(arg) = annotation.arg() {
class_path = BasicTypeSymbolPath::new(&arg.value(self.doc));
} else {
return;
return TraversalPolicy::default_to(false);
}


Expand Down Expand Up @@ -600,6 +602,8 @@ impl SyntaxNodeVisitor for SymbolScannerVisitor<'_> {
}
}
}

TraversalPolicy::default_to(false)
}

fn visit_member_func_decl(&mut self, n: &FunctionDeclarationNode, _: &TraversalContextStack) -> FunctionDeclarationTraversalPolicy {
Expand Down Expand Up @@ -666,7 +670,7 @@ impl SyntaxNodeVisitor for SymbolScannerVisitor<'_> {
}
}

fn visit_func_param_group(&mut self, n: &FunctionParameterGroupNode, _: &TraversalContextStack) {
fn visit_func_param_group(&mut self, n: &FunctionParameterGroupNode, _: &TraversalContextStack) -> FunctionParameterGroupTraversalPolicy {
let specifiers: SymbolSpecifiers<_> = n.specifiers()
.map(|sn| sn.value())
.filter_map(|s| FunctionParameterSpecifier::try_from(s).ok())
Expand Down Expand Up @@ -694,9 +698,11 @@ impl SyntaxNodeVisitor for SymbolScannerVisitor<'_> {

self.current_param_ordinal += 1;
}

TraversalPolicy::default_to(false)
}

fn visit_member_var_decl(&mut self, n: &MemberVarDeclarationNode, _: &TraversalContextStack) {
fn visit_member_var_decl(&mut self, n: &MemberVarDeclarationNode, _: &TraversalContextStack) -> MemberVarDeclarationTraversalPolicy {
let specifiers: SymbolSpecifiers<_> = n.specifiers()
.map(|sn| sn.value())
.filter_map(|s| MemberVarSpecifier::try_from(s).ok())
Expand Down Expand Up @@ -738,9 +744,11 @@ impl SyntaxNodeVisitor for SymbolScannerVisitor<'_> {

self.current_var_ordinal += 1;
}

TraversalPolicy::default_to(false)
}

fn visit_autobind_decl(&mut self, n: &AutobindDeclarationNode, _: &TraversalContextStack) {
fn visit_autobind_decl(&mut self, n: &AutobindDeclarationNode, _: &TraversalContextStack) -> AutobindDeclarationTraversalPolicy {
let name_node = n.name();
let autobind_name = name_node.value(&self.doc);
let path = MemberDataSymbolPath::new(&self.current_path, &autobind_name);
Expand All @@ -761,6 +769,8 @@ impl SyntaxNodeVisitor for SymbolScannerVisitor<'_> {

self.symtab.insert_symbol(sym);
}

TraversalPolicy::default_to(false)
}


Expand Down
16 changes: 12 additions & 4 deletions crates/analysis/src/jobs/syntax_analysis/contextual_analysis.rs
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ impl SyntaxNodeVisitor for ContextualSyntaxAnalysis<'_> {
self.visited_non_var_stmt_before = false;
}

fn visit_global_var_decl(&mut self, n: &MemberVarDeclarationNode) {
fn visit_global_var_decl(&mut self, n: &MemberVarDeclarationNode) -> MemberVarDeclarationTraversalPolicy {
if let Some(annot) = n.annotation() {
self.visit_annotation(&annot, MemberVarDeclarationNode::NODE_KIND, n.range());
} else {
Expand Down Expand Up @@ -306,9 +306,11 @@ impl SyntaxNodeVisitor for ContextualSyntaxAnalysis<'_> {
})
}
}

TraversalPolicy::default_to(false)
}

fn visit_member_var_decl(&mut self, n: &MemberVarDeclarationNode, ctx: &TraversalContextStack) {
fn visit_member_var_decl(&mut self, n: &MemberVarDeclarationNode, ctx: &TraversalContextStack) -> MemberVarDeclarationTraversalPolicy {
if let Some(range) = n.annotation().map(|ann| ann.range()) {
self.diagnostics.push(Diagnostic {
range,
Expand Down Expand Up @@ -354,6 +356,8 @@ impl SyntaxNodeVisitor for ContextualSyntaxAnalysis<'_> {
})
}
}

TraversalPolicy::default_to(false)
}

fn visit_member_func_decl(&mut self, n: &FunctionDeclarationNode, _: &TraversalContextStack) -> FunctionDeclarationTraversalPolicy {
Expand Down Expand Up @@ -381,7 +385,7 @@ impl SyntaxNodeVisitor for ContextualSyntaxAnalysis<'_> {
self.visited_non_var_stmt_before = false;
}

fn visit_autobind_decl(&mut self, n: &AutobindDeclarationNode, _: &TraversalContextStack) {
fn visit_autobind_decl(&mut self, n: &AutobindDeclarationNode, _: &TraversalContextStack) -> AutobindDeclarationTraversalPolicy {
let mut specifiers = SmallVec::<[AutobindSpecifier; 2]>::new();
let mut found_access_modif_before = false;

Expand Down Expand Up @@ -413,9 +417,11 @@ impl SyntaxNodeVisitor for ContextualSyntaxAnalysis<'_> {
})
}
}

TraversalPolicy::default_to(false)
}

fn visit_func_param_group(&mut self, n: &FunctionParameterGroupNode, _: &TraversalContextStack) {
fn visit_func_param_group(&mut self, n: &FunctionParameterGroupNode, _: &TraversalContextStack) -> FunctionParameterGroupTraversalPolicy {
let mut specifiers = SmallVec::<[FunctionParameterSpecifier; 2]>::new();

for (spec, range) in n.specifiers().map(|specn| (specn.value(), specn.range())) {
Expand All @@ -436,6 +442,8 @@ impl SyntaxNodeVisitor for ContextualSyntaxAnalysis<'_> {
})
}
}

TraversalPolicy::default_to(false)
}

fn visit_local_var_decl_stmt(&mut self, n: &LocalVarDeclarationNode, _: &TraversalContextStack) -> VarDeclarationTraversalPolicy {
Expand Down
36 changes: 27 additions & 9 deletions crates/analysis/src/jobs/syntax_analysis/syntax_error_visitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ impl SyntaxNodeVisitor for SyntaxErrorVisitor<'_> {
}
}

fn visit_enum_variant_decl(&mut self, n: &EnumVariantDeclarationNode) {
fn visit_enum_variant_decl(&mut self, n: &EnumVariantDeclarationNode) -> EnumVariantDeclarationTraversalPolicy {
if n.has_errors() {
self.check_identifier(&n.name());

Expand All @@ -242,9 +242,11 @@ impl SyntaxNodeVisitor for SyntaxErrorVisitor<'_> {
EnumVariantValue::Hex(n) => self.check_missing(&n, "variant integer value"),
});
}

TraversalPolicy::default_to(false)
}

fn visit_global_var_decl(&mut self, n: &MemberVarDeclarationNode) {
fn visit_global_var_decl(&mut self, n: &MemberVarDeclarationNode) -> MemberVarDeclarationTraversalPolicy {
if n.has_errors() {
if let Some(annot) = n.annotation() {
self.check_annotation(&annot);
Expand All @@ -255,9 +257,11 @@ impl SyntaxNodeVisitor for SyntaxErrorVisitor<'_> {

self.check_errors(n);
}

TraversalPolicy::default_to(false)
}

fn visit_member_var_decl(&mut self, n: &MemberVarDeclarationNode, _: &TraversalContextStack) {
fn visit_member_var_decl(&mut self, n: &MemberVarDeclarationNode, _: &TraversalContextStack) -> MemberVarDeclarationTraversalPolicy {
if n.has_errors() {
if let Some(annot) = n.annotation() {
self.check_annotation(&annot);
Expand All @@ -268,6 +272,8 @@ impl SyntaxNodeVisitor for SyntaxErrorVisitor<'_> {

self.check_errors(n);
}

TraversalPolicy::default_to(false)
}

fn visit_member_default_val(&mut self, n: &MemberDefaultValueNode, _: &TraversalContextStack) -> MemberDefaultValueTraversalPolicy {
Expand All @@ -287,31 +293,37 @@ impl SyntaxNodeVisitor for SyntaxErrorVisitor<'_> {
}
}

fn visit_member_hint(&mut self, n: &MemberHintNode, _: &TraversalContextStack) {
fn visit_member_hint(&mut self, n: &MemberHintNode, _: &TraversalContextStack) -> MemberHintTraversalPolicy {
if n.has_errors() {
self.check_identifier(&n.member());
self.check_missing(&n.value(), "hint string");

self.check_errors(n);
}

TraversalPolicy::default_to(false)
}

fn visit_autobind_decl(&mut self, n: &AutobindDeclarationNode, _: &TraversalContextStack) {
fn visit_autobind_decl(&mut self, n: &AutobindDeclarationNode, _: &TraversalContextStack) -> AutobindDeclarationTraversalPolicy {
if n.has_errors() {
self.check_identifier(&n.name());
self.check_type_annot(&n.autobind_type());

self.check_errors(n);
}

TraversalPolicy::default_to(false)
}

fn visit_func_param_group(&mut self, n: &FunctionParameterGroupNode, _: &TraversalContextStack) {
fn visit_func_param_group(&mut self, n: &FunctionParameterGroupNode, _: &TraversalContextStack) -> FunctionParameterGroupTraversalPolicy {
if n.has_errors() {
n.names().for_each(|name| { self.check_identifier(&name); } );
self.check_type_annot(&n.param_type());

self.check_errors(n);
}

TraversalPolicy::default_to(false)
}

fn visit_global_func_decl(&mut self, n: &FunctionDeclarationNode) -> FunctionDeclarationTraversalPolicy {
Expand Down Expand Up @@ -511,16 +523,20 @@ impl SyntaxNodeVisitor for SyntaxErrorVisitor<'_> {
}
}

fn visit_break_stmt(&mut self, n: &BreakStatementNode, _: &TraversalContextStack) {
fn visit_break_stmt(&mut self, n: &BreakStatementNode, _: &TraversalContextStack) -> BreakStatementTraversalPolicy {
if n.has_errors() {
self.check_errors(n);
}

TraversalPolicy::default_to(false)
}

fn visit_continue_stmt(&mut self, n: &ContinueStatementNode, _: &TraversalContextStack) {
fn visit_continue_stmt(&mut self, n: &ContinueStatementNode, _: &TraversalContextStack) -> ContinueStatementTraversalPolicy {
if n.has_errors() {
self.check_errors(n);
}

TraversalPolicy::default_to(false)
}

fn visit_delete_stmt(&mut self, n: &DeleteStatementNode, _: &TraversalContextStack) -> DeleteStatementTraversalPolicy {
Expand Down Expand Up @@ -650,10 +666,12 @@ impl SyntaxNodeVisitor for SyntaxErrorVisitor<'_> {
}
}

fn visit_switch_stmt_default(&mut self, n: &SwitchConditionalDefaultLabelNode, _: &TraversalContextStack) {
fn visit_switch_stmt_default(&mut self, n: &SwitchConditionalDefaultLabelNode, _: &TraversalContextStack) -> SwitchConditionalDefaultLabelTraversalPolicy {
if n.has_errors() {
self.check_errors(n);
}

TraversalPolicy::default_to(false)
}


Expand Down
36 changes: 27 additions & 9 deletions crates/analysis/src/utils/visitors/position_filter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,11 +140,13 @@ impl SyntaxNodeVisitor for PositionFilter {
tp
}

fn visit_enum_variant_decl(&mut self, n: &EnumVariantDeclarationNode) {
fn visit_enum_variant_decl(&mut self, n: &EnumVariantDeclarationNode) -> EnumVariantDeclarationTraversalPolicy {
self.currently_in_range = n.spans_position(self.pos);
if self.currently_in_range {
self.payload.borrow_mut().done = true;
}

TraversalPolicy::default_to(false)
}

fn visit_global_func_decl(&mut self, n: &FunctionDeclarationNode) -> FunctionDeclarationTraversalPolicy {
Expand All @@ -171,11 +173,13 @@ impl SyntaxNodeVisitor for PositionFilter {
self.currently_in_callable_range = false;
}

fn visit_global_var_decl(&mut self, n: &MemberVarDeclarationNode) {
fn visit_global_var_decl(&mut self, n: &MemberVarDeclarationNode) -> MemberVarDeclarationTraversalPolicy {
self.currently_in_range = n.spans_position(self.pos);
if self.currently_in_range {
self.payload.borrow_mut().done = true;
}

TraversalPolicy::default_to(false)
}


Expand Down Expand Up @@ -229,32 +233,40 @@ impl SyntaxNodeVisitor for PositionFilter {
self.currently_in_callable_range = false;
}

fn visit_func_param_group(&mut self, n: &FunctionParameterGroupNode, _: &TraversalContextStack) {
fn visit_func_param_group(&mut self, n: &FunctionParameterGroupNode, _: &TraversalContextStack) -> FunctionParameterGroupTraversalPolicy {
self.currently_in_range = n.spans_position(self.pos);
if self.currently_in_range {
self.payload.borrow_mut().done = true;
}

TraversalPolicy::default_to(false)
}

fn visit_member_var_decl(&mut self, n: &MemberVarDeclarationNode, _: &TraversalContextStack) {
fn visit_member_var_decl(&mut self, n: &MemberVarDeclarationNode, _: &TraversalContextStack) -> MemberVarDeclarationTraversalPolicy {
self.currently_in_range = n.spans_position(self.pos);
if self.currently_in_range {
self.payload.borrow_mut().done = true;
}

TraversalPolicy::default_to(false)
}

fn visit_autobind_decl(&mut self, n: &AutobindDeclarationNode, _: &TraversalContextStack) {
fn visit_autobind_decl(&mut self, n: &AutobindDeclarationNode, _: &TraversalContextStack) -> AutobindDeclarationTraversalPolicy {
self.currently_in_range = n.spans_position(self.pos);
if self.currently_in_range {
self.payload.borrow_mut().done = true;
}

TraversalPolicy::default_to(false)
}

fn visit_member_hint(&mut self, n: &MemberHintNode, _: &TraversalContextStack) {
fn visit_member_hint(&mut self, n: &MemberHintNode, _: &TraversalContextStack) -> MemberHintTraversalPolicy {
self.currently_in_range = n.spans_position(self.pos);
if self.currently_in_range {
self.payload.borrow_mut().done = true;
}

TraversalPolicy::default_to(false)
}

fn visit_member_default_val(&mut self, n: &MemberDefaultValueNode, _: &TraversalContextStack) -> MemberDefaultValueTraversalPolicy {
Expand Down Expand Up @@ -450,25 +462,31 @@ impl SyntaxNodeVisitor for PositionFilter {
tp
}

fn visit_switch_stmt_default(&mut self, n: &SwitchConditionalDefaultLabelNode, _: &TraversalContextStack) {
fn visit_switch_stmt_default(&mut self, n: &SwitchConditionalDefaultLabelNode, _: &TraversalContextStack) -> SwitchConditionalDefaultLabelTraversalPolicy {
self.currently_in_range = n.spans_position(self.pos);
if self.currently_in_range {
self.payload.borrow_mut().done = true;
}

TraversalPolicy::default_to(false)
}

fn visit_break_stmt(&mut self, n: &BreakStatementNode, _: &TraversalContextStack) {
fn visit_break_stmt(&mut self, n: &BreakStatementNode, _: &TraversalContextStack) -> BreakStatementTraversalPolicy {
self.currently_in_range = n.spans_position(self.pos);
if self.currently_in_range {
self.payload.borrow_mut().done = true;
}

TraversalPolicy::default_to(false)
}

fn visit_continue_stmt(&mut self, n: &ContinueStatementNode, _: &TraversalContextStack) {
fn visit_continue_stmt(&mut self, n: &ContinueStatementNode, _: &TraversalContextStack) -> ContinueStatementTraversalPolicy {
self.currently_in_range = n.spans_position(self.pos);
if self.currently_in_range {
self.payload.borrow_mut().done = true;
}

TraversalPolicy::default_to(false)
}

fn visit_delete_stmt(&mut self, n: &DeleteStatementNode, _: &TraversalContextStack) -> DeleteStatementTraversalPolicy {
Expand Down
Loading

0 comments on commit 33aebc8

Please sign in to comment.