Skip to content

Commit

Permalink
resolve_references_for_root_scope
Browse files Browse the repository at this point in the history
  • Loading branch information
overlookmotel committed Jul 13, 2024
1 parent 96dff46 commit b1b4b96
Showing 1 changed file with 25 additions and 11 deletions.
36 changes: 25 additions & 11 deletions crates/oxc_semantic/src/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ use crate::{
module_record::ModuleRecordBuilder,
node::{AstNode, AstNodeId, AstNodes, NodeFlags},
reference::{Reference, ReferenceFlag, ReferenceId},
scope::{ScopeFlags, ScopeId, ScopeTree},
scope::{ScopeFlags, ScopeId, ScopeTree, UnresolvedReferences},
symbol::{SymbolFlags, SymbolId, SymbolTable},
JSDocFinder, Semantic,
};
Expand Down Expand Up @@ -199,12 +199,6 @@ impl<'a> SemanticBuilder<'a> {
if self.check_syntax_error {
checker::check_module_record(&self);
}

// Convert remaining unresolved references to a standard hash map
debug_assert_eq!(self.current_scope_depth, 0);
let mut unresolved_references = self.unresolved_references.into_iter().next().unwrap();
self.scope.root_unresolved_references =
unresolved_references.drain().map(|line| (line.name, line.reference_ids)).collect();
}

let jsdoc = if self.build_jsdoc { self.jsdoc.build() } else { JSDocFinder::default() };
Expand Down Expand Up @@ -382,8 +376,7 @@ impl<'a> SemanticBuilder<'a> {

let bindings = self.scope.get_bindings(self.current_scope_id);
for line in current_refs.drain() {
// Try to resolve a reference.
// If unresolved, transfer it to parent scope's unresolved references.
// Try to resolve reference. If unresolved, transfer it to parent scope's unresolved references.
if let Some(symbol_id) = bindings.get(&line.name).copied() {
for reference_id in &line.reference_ids {
self.symbols.references[*reference_id].set_symbol_id(symbol_id);
Expand All @@ -395,6 +388,25 @@ impl<'a> SemanticBuilder<'a> {
}
}

fn resolve_references_for_root_scope(&mut self) {
let mut root_unresolved_references = UnresolvedReferences::default();

let bindings = self.scope.get_bindings(self.current_scope_id);
for line in self.unresolved_references[self.current_scope_depth].drain() {
// Try to resolve reference. If unresolved, transfer it to root unresolved references.
if let Some(symbol_id) = bindings.get(&line.name).copied() {
for reference_id in &line.reference_ids {
self.symbols.references[*reference_id].set_symbol_id(symbol_id);
}
self.symbols.resolved_references[symbol_id].extend(line.reference_ids);
} else {
root_unresolved_references.insert(line.name, line.reference_ids);
}
}

self.scope.root_unresolved_references = root_unresolved_references;
}

pub fn add_redeclare_variable(&mut self, symbol_id: SymbolId, span: Span) {
self.symbols.add_redeclare_variable(symbol_id, span);
}
Expand Down Expand Up @@ -456,11 +468,13 @@ impl<'a> Visit<'a> for SemanticBuilder<'a> {
}

fn leave_scope(&mut self) {
self.resolve_references_for_current_scope();
if let Some(parent_id) = self.scope.get_parent_id(self.current_scope_id) {
self.resolve_references_for_current_scope();
self.current_scope_id = parent_id;
self.current_scope_depth -= 1;
} else {
self.resolve_references_for_root_scope();
}
self.current_scope_depth -= 1;
}

// Setup all the context for the binder.
Expand Down

0 comments on commit b1b4b96

Please sign in to comment.