feat(semantic2): track symbol references

This commit is contained in:
Boshen 2023-05-14 11:30:21 +08:00
parent d14329e74e
commit 9d0ac75f87
No known key found for this signature in database
GPG key ID: 9C7A8C8AB22BEBD1
4 changed files with 37 additions and 3 deletions

View file

@ -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)
}
}

View file

@ -1,4 +1,5 @@
mod builder;
pub mod reference;
pub mod scope;
pub mod symbol;

View 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
}
}

View file

@ -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() {