diff --git a/crates/oxc_semantic2/src/builder.rs b/crates/oxc_semantic2/src/builder.rs index aa94a47b4..f1d68661f 100644 --- a/crates/oxc_semantic2/src/builder.rs +++ b/crates/oxc_semantic2/src/builder.rs @@ -1,6 +1,7 @@ use oxc_span::{Atom, SourceType, Span}; use crate::{ + reference::Reference, scope::{Scope, ScopeFlags, ScopeId, ScopeTree}, symbol::{SymbolFlags, SymbolId, SymbolTable}, Semantic, @@ -79,9 +80,12 @@ impl SemanticBuilder { } fn resolve_reference(&mut self, name: &Atom) -> Option { - self.scope_tree + let symbol_id = self + .scope_tree .ancestors(self.current_scope_id) - .find_map(|scope_id| self.scope_tree.get_scope(scope_id).get_binding(name)) + .find_map(|scope_id| self.scope_tree.get_scope(scope_id).get_binding(name))?; + self.symbol_table.add_reference(Reference::new_read(symbol_id)); + Some(symbol_id) } } diff --git a/crates/oxc_semantic2/src/lib.rs b/crates/oxc_semantic2/src/lib.rs index b4ae3fd8f..8ddd23d8a 100644 --- a/crates/oxc_semantic2/src/lib.rs +++ b/crates/oxc_semantic2/src/lib.rs @@ -1,4 +1,5 @@ mod builder; +pub mod reference; pub mod scope; pub mod symbol; diff --git a/crates/oxc_semantic2/src/reference.rs b/crates/oxc_semantic2/src/reference.rs new file mode 100644 index 000000000..0d9b75929 --- /dev/null +++ b/crates/oxc_semantic2/src/reference.rs @@ -0,0 +1,16 @@ +use crate::symbol::SymbolId; + +#[derive(Debug, Clone)] +pub struct Reference { + symbol_id: SymbolId, +} + +impl Reference { + pub fn new_read(symbol_id: SymbolId) -> Self { + Self { symbol_id } + } + + pub fn symbol_id(&self) -> SymbolId { + self.symbol_id + } +} diff --git a/crates/oxc_semantic2/src/symbol.rs b/crates/oxc_semantic2/src/symbol.rs index b62205dbd..a8c12a2cc 100644 --- a/crates/oxc_semantic2/src/symbol.rs +++ b/crates/oxc_semantic2/src/symbol.rs @@ -4,6 +4,8 @@ use bitflags::bitflags; use oxc_index::{Idx, IndexVec}; use oxc_span::{Atom, Span}; +use crate::reference::Reference; + #[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash)] pub struct SymbolId(usize); @@ -62,11 +64,17 @@ pub struct SymbolTable { names: IndexVec, spans: IndexVec, flags: IndexVec, + references: IndexVec>, } impl SymbolTable { pub fn new() -> Self { - Self { names: IndexVec::new(), spans: IndexVec::new(), flags: IndexVec::new() } + Self { + names: IndexVec::new(), + spans: IndexVec::new(), + flags: IndexVec::new(), + references: IndexVec::new(), + } } pub fn get_name(&self, symbol_id: SymbolId) -> &Atom { @@ -76,9 +84,14 @@ impl SymbolTable { pub fn add_symbol(&mut self, name: Atom, span: Span, flag: SymbolFlags) -> SymbolId { let _ = self.names.push(name); let _ = self.spans.push(span); + let _ = self.references.push(vec![]); self.flags.push(flag) } + pub fn add_reference(&mut self, reference: Reference) { + self.references[reference.symbol_id()].push(reference); + } + pub fn mangle(&mut self) { let mut offset = 0; for (symbol_id, flag) in self.flags.iter_enumerated() {