From c4fbba10a7e0f1cb231cde5f2fe32a41bdb89fd0 Mon Sep 17 00:00:00 2001 From: Dunqing Date: Wed, 17 Jul 2024 23:30:13 +0800 Subject: [PATCH 01/16] test: visit --- crates/oxc_semantic/src/builder.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index da7a1b47b9d68..ac5f7be587deb 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -100,6 +100,32 @@ pub struct SemanticBuilderReturn<'a> { pub errors: Vec, } +#[derive(Default)] +pub struct Collect { + node: u32, + scope: u32, + symbol: u32, + reference: u32, +} + +impl<'a> Visit<'a> for Collect { + fn enter_node(&mut self, _: AstKind<'a>) { + self.node += 1; + } + fn enter_scope(&mut self, _: ScopeFlags, _: &Cell>) { + self.scope += 1; + } + fn visit_binding_identifier(&mut self, _: &BindingIdentifier<'a>) { + self.symbol += 1; + } + fn visit_identifier_reference(&mut self, _: &IdentifierReference<'a>) { + self.reference += 1; + } + fn visit_jsx_identifier(&mut self, _: &JSXIdentifier<'a>) { + self.reference += 1; + } +} + impl<'a> SemanticBuilder<'a> { pub fn new(source_text: &'a str, source_type: SourceType) -> Self { let scope = ScopeTree::default(); @@ -192,6 +218,7 @@ impl<'a> SemanticBuilder<'a> { let scope_id = self.scope.add_scope(None, AstNodeId::DUMMY, ScopeFlags::Top); program.scope_id.set(Some(scope_id)); } else { + Collect::default().visit_program(program); self.visit_program(program); // Checking syntax error on module record requires scope information from the previous AST pass From 59e4c74a004cbb20871b323e4b9441189e73cb1b Mon Sep 17 00:00:00 2001 From: Dunqing Date: Thu, 18 Jul 2024 00:09:27 +0800 Subject: [PATCH 02/16] feat: reserve --- crates/oxc_semantic/src/builder.rs | 25 ++++++++++++++++++------- crates/oxc_semantic/src/node.rs | 5 +++++ crates/oxc_semantic/src/scope.rs | 8 ++++++++ crates/oxc_semantic/src/symbol.rs | 11 +++++++++++ 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index ac5f7be587deb..b5ef9f9ec8b5c 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -101,20 +101,27 @@ pub struct SemanticBuilderReturn<'a> { } #[derive(Default)] -pub struct Collect { - node: u32, - scope: u32, - symbol: u32, - reference: u32, +pub struct Collector { + node: usize, + scope: usize, + symbol: usize, + reference: usize, } -impl<'a> Visit<'a> for Collect { +impl<'a> Visit<'a> for Collector { + #[inline] fn enter_node(&mut self, _: AstKind<'a>) { self.node += 1; } + #[inline] fn enter_scope(&mut self, _: ScopeFlags, _: &Cell>) { self.scope += 1; } + #[inline] + fn leave_node(&mut self, _: AstKind<'a>) {} + #[inline] + fn leave_scope(&mut self) {} + fn visit_binding_identifier(&mut self, _: &BindingIdentifier<'a>) { self.symbol += 1; } @@ -218,7 +225,11 @@ impl<'a> SemanticBuilder<'a> { let scope_id = self.scope.add_scope(None, AstNodeId::DUMMY, ScopeFlags::Top); program.scope_id.set(Some(scope_id)); } else { - Collect::default().visit_program(program); + let mut collector = Collector::default(); + collector.visit_program(program); + self.nodes.reserve(collector.node); + self.scope.reserve(collector.scope); + self.symbols.reserve(collector.symbol, collector.reference); self.visit_program(program); // Checking syntax error on module record requires scope information from the previous AST pass diff --git a/crates/oxc_semantic/src/node.rs b/crates/oxc_semantic/src/node.rs index 8c4805b68a243..1e2c6ea16ca26 100644 --- a/crates/oxc_semantic/src/node.rs +++ b/crates/oxc_semantic/src/node.rs @@ -162,6 +162,11 @@ impl<'a> AstNodes<'a> { self.nodes.push(node); ast_node_id } + + pub fn reserve(&mut self, additional: usize) { + self.nodes.reserve(additional); + self.parent_ids.reserve(additional); + } } #[derive(Debug)] diff --git a/crates/oxc_semantic/src/scope.rs b/crates/oxc_semantic/src/scope.rs index 379c457542158..2eb2ba3f7c6f2 100644 --- a/crates/oxc_semantic/src/scope.rs +++ b/crates/oxc_semantic/src/scope.rs @@ -218,4 +218,12 @@ impl ScopeTree { pub fn remove_binding(&mut self, scope_id: ScopeId, name: &CompactStr) { self.bindings[scope_id].shift_remove(name); } + + pub fn reserve(&mut self, additional: usize) { + self.parent_ids.reserve(additional); + self.child_ids.reserve(additional); + self.flags.reserve(additional); + self.bindings.reserve(additional); + self.node_ids.reserve(additional); + } } diff --git a/crates/oxc_semantic/src/symbol.rs b/crates/oxc_semantic/src/symbol.rs index 80bc798c1a0fa..5e61751263910 100644 --- a/crates/oxc_semantic/src/symbol.rs +++ b/crates/oxc_semantic/src/symbol.rs @@ -193,4 +193,15 @@ impl SymbolTable { _ => false, } } + + pub fn reserve(&mut self, additional: usize, reference: usize) { + self.spans.reserve(additional); + self.names.reserve(additional); + self.flags.reserve(additional); + self.scope_ids.reserve(additional); + self.declarations.reserve(additional); + self.resolved_references.reserve(additional); + self.redeclare_variables.reserve(additional); + self.references.reserve(reference); + } } From f573c3463ef3b527458038f91f14dffe42faa89c Mon Sep 17 00:00:00 2001 From: Dunqing Date: Fri, 19 Jul 2024 08:34:31 +0800 Subject: [PATCH 03/16] feat: improve small file --- crates/oxc_semantic/src/builder.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index b5ef9f9ec8b5c..82a2b7dbf3ad1 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -224,6 +224,12 @@ impl<'a> SemanticBuilder<'a> { if self.source_type.is_typescript_definition() { let scope_id = self.scope.add_scope(None, AstNodeId::DUMMY, ScopeFlags::Top); program.scope_id.set(Some(scope_id)); + } + + if self.source_text.len() < 4000 { + self.nodes.reserve(self.source_text.split_ascii_whitespace().count()); + self.scope.reserve(program.body.len()); + self.symbols.reserve(program.body.len(), program.body.len()); } else { let mut collector = Collector::default(); collector.visit_program(program); @@ -231,11 +237,11 @@ impl<'a> SemanticBuilder<'a> { self.scope.reserve(collector.scope); self.symbols.reserve(collector.symbol, collector.reference); self.visit_program(program); + } - // Checking syntax error on module record requires scope information from the previous AST pass - if self.check_syntax_error { - checker::check_module_record(&self); - } + // Checking syntax error on module record requires scope information from the previous AST pass + if self.check_syntax_error { + checker::check_module_record(&self); } debug_assert_eq!(self.current_scope_depth, 0); From a698196795d06bd604527da13036b229868182f2 Mon Sep 17 00:00:00 2001 From: Dunqing Date: Fri, 19 Jul 2024 08:43:03 +0800 Subject: [PATCH 04/16] fix --- crates/oxc_semantic/src/builder.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index 9d43b286889a1..2b7e649e08691 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -227,7 +227,7 @@ impl<'a> SemanticBuilder<'a> { } if self.source_text.len() < 4000 { - self.nodes.reserve(self.source_text.split_ascii_whitespace().count()); + self.nodes.reserve(program.body.len() * 4); self.scope.reserve(program.body.len()); self.symbols.reserve(program.body.len(), program.body.len()); } else { From dc6b249fcdd3ccbaefe8e8a4d1515540f521eded Mon Sep 17 00:00:00 2001 From: Dunqing Date: Fri, 19 Jul 2024 08:47:12 +0800 Subject: [PATCH 05/16] Fix --- crates/oxc_semantic/src/builder.rs | 32 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index 2b7e649e08691..2563451be8673 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -224,24 +224,24 @@ impl<'a> SemanticBuilder<'a> { if self.source_type.is_typescript_definition() { let scope_id = self.scope.add_scope(None, AstNodeId::DUMMY, ScopeFlags::Top); program.scope_id.set(Some(scope_id)); - } - - if self.source_text.len() < 4000 { - self.nodes.reserve(program.body.len() * 4); - self.scope.reserve(program.body.len()); - self.symbols.reserve(program.body.len(), program.body.len()); } else { - let mut collector = Collector::default(); - collector.visit_program(program); - self.nodes.reserve(collector.node); - self.scope.reserve(collector.scope); - self.symbols.reserve(collector.symbol, collector.reference); - self.visit_program(program); - } + if self.source_text.len() < 4000 { + self.nodes.reserve(self.source_text.split_ascii_whitespace().count()); + self.scope.reserve(program.body.len()); + self.symbols.reserve(program.body.len(), program.body.len()); + } else { + let mut collector = Collector::default(); + collector.visit_program(program); + self.nodes.reserve(collector.node); + self.scope.reserve(collector.scope); + self.symbols.reserve(collector.symbol, collector.reference); + self.visit_program(program); + } - // Checking syntax error on module record requires scope information from the previous AST pass - if self.check_syntax_error { - checker::check_module_record(&self); + // Checking syntax error on module record requires scope information from the previous AST pass + if self.check_syntax_error { + checker::check_module_record(&self); + } } debug_assert_eq!(self.current_scope_depth, 0); From 53bc5f53c0d8a5fd62faf7094acb1ff963575762 Mon Sep 17 00:00:00 2001 From: Dunqing Date: Fri, 19 Jul 2024 08:51:52 +0800 Subject: [PATCH 06/16] Fix --- crates/oxc_semantic/src/builder.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index 2563451be8673..2d3fc172eabdb 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -235,9 +235,9 @@ impl<'a> SemanticBuilder<'a> { self.nodes.reserve(collector.node); self.scope.reserve(collector.scope); self.symbols.reserve(collector.symbol, collector.reference); - self.visit_program(program); } + self.visit_program(program); // Checking syntax error on module record requires scope information from the previous AST pass if self.check_syntax_error { checker::check_module_record(&self); From e68d3fd19b4e9ccc23b646dfd82196061c301963 Mon Sep 17 00:00:00 2001 From: Dunqing Date: Fri, 19 Jul 2024 09:08:53 +0800 Subject: [PATCH 07/16] avoid reserve for symbols --- crates/oxc_semantic/src/builder.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index 2d3fc172eabdb..555eeb72709cd 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -228,7 +228,7 @@ impl<'a> SemanticBuilder<'a> { if self.source_text.len() < 4000 { self.nodes.reserve(self.source_text.split_ascii_whitespace().count()); self.scope.reserve(program.body.len()); - self.symbols.reserve(program.body.len(), program.body.len()); + // self.symbols.reserve(program.body.len(), program.body.len()); } else { let mut collector = Collector::default(); collector.visit_program(program); From 221674f34ae19024fa181fcc811475320a8b5a55 Mon Sep 17 00:00:00 2001 From: Dunqing Date: Fri, 19 Jul 2024 09:31:38 +0800 Subject: [PATCH 08/16] U --- crates/oxc_semantic/src/builder.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index 555eeb72709cd..02e86d82744fd 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -226,7 +226,7 @@ impl<'a> SemanticBuilder<'a> { program.scope_id.set(Some(scope_id)); } else { if self.source_text.len() < 4000 { - self.nodes.reserve(self.source_text.split_ascii_whitespace().count()); + // self.nodes.reserve(self.source_text.split_ascii_whitespace().count()); self.scope.reserve(program.body.len()); // self.symbols.reserve(program.body.len(), program.body.len()); } else { From 753c64d6322a7d54d4e7de2070cf3045621af02f Mon Sep 17 00:00:00 2001 From: Dunqing Date: Fri, 19 Jul 2024 09:48:45 +0800 Subject: [PATCH 09/16] Update --- crates/oxc_semantic/src/builder.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index 02e86d82744fd..ec7bcbb67e4f0 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -226,9 +226,7 @@ impl<'a> SemanticBuilder<'a> { program.scope_id.set(Some(scope_id)); } else { if self.source_text.len() < 4000 { - // self.nodes.reserve(self.source_text.split_ascii_whitespace().count()); - self.scope.reserve(program.body.len()); - // self.symbols.reserve(program.body.len(), program.body.len()); + self.nodes.reserve(program.body.len() * 8); } else { let mut collector = Collector::default(); collector.visit_program(program); From ad6aa55b4f5f577a13516f397f2c370f4e6e26b2 Mon Sep 17 00:00:00 2001 From: Dunqing Date: Fri, 19 Jul 2024 12:57:07 +0800 Subject: [PATCH 10/16] Revert --- crates/oxc_semantic/src/builder.rs | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index ec7bcbb67e4f0..968f1556ad085 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -225,15 +225,11 @@ impl<'a> SemanticBuilder<'a> { let scope_id = self.scope.add_scope(None, AstNodeId::DUMMY, ScopeFlags::Top); program.scope_id.set(Some(scope_id)); } else { - if self.source_text.len() < 4000 { - self.nodes.reserve(program.body.len() * 8); - } else { - let mut collector = Collector::default(); - collector.visit_program(program); - self.nodes.reserve(collector.node); - self.scope.reserve(collector.scope); - self.symbols.reserve(collector.symbol, collector.reference); - } + let mut collector = Collector::default(); + collector.visit_program(program); + self.nodes.reserve(collector.node); + self.scope.reserve(collector.scope); + self.symbols.reserve(collector.symbol, collector.reference); self.visit_program(program); // Checking syntax error on module record requires scope information from the previous AST pass From 88b4bdfc6cd6ae561b05fdf1325d97864a42becd Mon Sep 17 00:00:00 2001 From: Dunqing Date: Fri, 19 Jul 2024 18:10:38 +0800 Subject: [PATCH 11/16] Correct --- crates/oxc_semantic/src/builder.rs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index 968f1556ad085..14bda5435d2a0 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -100,7 +100,7 @@ pub struct SemanticBuilderReturn<'a> { pub errors: Vec, } -#[derive(Default)] +#[derive(Default, Debug)] pub struct Collector { node: usize, scope: usize, @@ -124,13 +124,32 @@ impl<'a> Visit<'a> for Collector { fn visit_binding_identifier(&mut self, _: &BindingIdentifier<'a>) { self.symbol += 1; + self.node += 1; } fn visit_identifier_reference(&mut self, _: &IdentifierReference<'a>) { self.reference += 1; + self.node += 1; } fn visit_jsx_identifier(&mut self, _: &JSXIdentifier<'a>) { self.reference += 1; + self.node += 1; } + fn visit_jsx_member_expression_object(&mut self, it: &JSXMemberExpressionObject<'a>) { + if let JSXMemberExpressionObject::MemberExpression(expr) = &it { + self.visit_jsx_member_expression(expr); + } else { + self.node += 1; + } + } + // fn visit_jsx_element_name(&mut self, it: &JSXElementName<'a>) { + // if let JSXElementName::Identifier(ident) = it { + // if !ident.name.chars().next().is_some_and(char::is_uppercase) { + // return; + // } + // } + + // self.visit_jsx_element_name(it); + // } } impl<'a> SemanticBuilder<'a> { From b4a8d675e0dd9999f2098000fecbb4330470d45e Mon Sep 17 00:00:00 2001 From: Dunqing Date: Fri, 19 Jul 2024 19:05:12 +0800 Subject: [PATCH 12/16] Update --- crates/oxc_semantic/src/builder.rs | 44 ++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index 14bda5435d2a0..d5a6ba3691962 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -117,39 +117,59 @@ impl<'a> Visit<'a> for Collector { fn enter_scope(&mut self, _: ScopeFlags, _: &Cell>) { self.scope += 1; } - #[inline] - fn leave_node(&mut self, _: AstKind<'a>) {} - #[inline] - fn leave_scope(&mut self) {} + #[inline] fn visit_binding_identifier(&mut self, _: &BindingIdentifier<'a>) { self.symbol += 1; self.node += 1; } + + #[inline] fn visit_identifier_reference(&mut self, _: &IdentifierReference<'a>) { self.reference += 1; self.node += 1; } + + #[inline] fn visit_jsx_identifier(&mut self, _: &JSXIdentifier<'a>) { self.reference += 1; self.node += 1; } + + #[inline] fn visit_jsx_member_expression_object(&mut self, it: &JSXMemberExpressionObject<'a>) { + self.node += 1; if let JSXMemberExpressionObject::MemberExpression(expr) = &it { self.visit_jsx_member_expression(expr); } else { self.node += 1; } } - // fn visit_jsx_element_name(&mut self, it: &JSXElementName<'a>) { - // if let JSXElementName::Identifier(ident) = it { - // if !ident.name.chars().next().is_some_and(char::is_uppercase) { - // return; - // } - // } - // self.visit_jsx_element_name(it); - // } + #[inline] + fn visit_jsx_element_name(&mut self, it: &JSXElementName<'a>) { + self.node += 1; + if let JSXElementName::Identifier(ident) = it { + self.node += 1; + if ident.name.chars().next().is_some_and(char::is_uppercase) { + self.reference += 1; + } + } else { + self.visit_jsx_element_name(it); + } + } + + #[inline] + fn visit_jsx_attribute_name(&mut self, it: &JSXAttributeName<'a>) { + // NOTE: AstKind doesn't exists! + // self.node += 1; + + if let JSXAttributeName::Identifier(_) = it { + self.node += 1; + } else { + self.visit_jsx_attribute_name(it); + } + } } impl<'a> SemanticBuilder<'a> { From 2992c54ccec63192fdde82dab0e14d6e4a053bc5 Mon Sep 17 00:00:00 2001 From: Dunqing Date: Fri, 19 Jul 2024 19:23:22 +0800 Subject: [PATCH 13/16] fix: stack overflow --- crates/oxc_semantic/src/builder.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index d5a6ba3691962..f5287c84b60d5 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -149,13 +149,15 @@ impl<'a> Visit<'a> for Collector { #[inline] fn visit_jsx_element_name(&mut self, it: &JSXElementName<'a>) { self.node += 1; - if let JSXElementName::Identifier(ident) = it { - self.node += 1; - if ident.name.chars().next().is_some_and(char::is_uppercase) { - self.reference += 1; + match it { + JSXElementName::Identifier(ident) => { + self.node += 1; + if ident.name.chars().next().is_some_and(char::is_uppercase) { + self.reference += 1; + } } - } else { - self.visit_jsx_element_name(it); + JSXElementName::NamespacedName(name) => self.visit_jsx_namespaced_name(name), + JSXElementName::MemberExpression(expr) => self.visit_jsx_member_expression(expr), } } From 9d58b6cb6fc85a51026b3ae749134c5b4979720f Mon Sep 17 00:00:00 2001 From: Dunqing Date: Fri, 19 Jul 2024 19:33:28 +0800 Subject: [PATCH 14/16] fix: stack overflow --- crates/oxc_semantic/src/builder.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index f5287c84b60d5..b031a96cb9cd7 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -166,10 +166,10 @@ impl<'a> Visit<'a> for Collector { // NOTE: AstKind doesn't exists! // self.node += 1; - if let JSXAttributeName::Identifier(_) = it { - self.node += 1; + if let JSXAttributeName::NamespacedName(name) = it { + self.visit_jsx_namespaced_name(name); } else { - self.visit_jsx_attribute_name(it); + self.node += 1; } } } From d7b8072be6c4f2a3ae881dafe9019de05452c324 Mon Sep 17 00:00:00 2001 From: Dunqing Date: Fri, 19 Jul 2024 21:44:25 +0800 Subject: [PATCH 15/16] fix: symbols less than collected by collector --- crates/oxc_semantic/src/builder.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index 3c069926d7454..d2905c1d1b2d7 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -172,6 +172,20 @@ impl<'a> Visit<'a> for Collector { self.node += 1; } } + + #[inline] + fn visit_ts_enum_member_name(&mut self, it: &TSEnumMemberName<'a>) { + if !it.is_expression() { + self.symbol += 1; + } + walk_ts_enum_member_name(self, it); + } + + #[inline] + fn visit_ts_module_declaration_name(&mut self, it: &TSModuleDeclarationName<'a>) { + self.symbol += 1; + walk_ts_module_declaration_name(self, it); + } } impl<'a> SemanticBuilder<'a> { From 1cec1518815bd5c165a19bc84c3b0cff654d25e8 Mon Sep 17 00:00:00 2001 From: Dunqing Date: Fri, 19 Jul 2024 22:03:31 +0800 Subject: [PATCH 16/16] chore: add debug assert --- crates/oxc_semantic/src/builder.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index d2905c1d1b2d7..8c21e29584ed5 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -6,6 +6,7 @@ use std::{ sync::Arc, }; +use oxc_ast::visit::walk::{walk_ts_enum_member_name, walk_ts_module_declaration_name}; #[allow(clippy::wildcard_imports)] use oxc_ast::{ast::*, AstKind, Trivias, Visit}; use oxc_cfg::{ @@ -287,6 +288,12 @@ impl<'a> SemanticBuilder<'a> { self.symbols.reserve(collector.symbol, collector.reference); self.visit_program(program); + + debug_assert_eq!(self.nodes.len(), collector.node); + debug_assert_eq!(self.scope.len(), collector.scope); + debug_assert_eq!(self.symbols.references.len(), collector.reference); + debug_assert!(collector.symbol >= self.symbols.len()); + // Checking syntax error on module record requires scope information from the previous AST pass if self.check_syntax_error { checker::check_module_record(&self);