mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 12:21:58 +00:00
feat(semantic2): track symbol references
This commit is contained in:
parent
d14329e74e
commit
9d0ac75f87
4 changed files with 37 additions and 3 deletions
|
|
@ -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<SymbolId> {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
mod builder;
|
||||
pub mod reference;
|
||||
pub mod scope;
|
||||
pub mod symbol;
|
||||
|
||||
|
|
|
|||
16
crates/oxc_semantic2/src/reference.rs
Normal file
16
crates/oxc_semantic2/src/reference.rs
Normal file
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
@ -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<SymbolId, Atom>,
|
||||
spans: IndexVec<SymbolId, Span>,
|
||||
flags: IndexVec<SymbolId, SymbolFlags>,
|
||||
references: IndexVec<SymbolId, Vec<Reference>>,
|
||||
}
|
||||
|
||||
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() {
|
||||
|
|
|
|||
Loading…
Reference in a new issue