mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 20:32:10 +00:00
feat(semantic): support get node id by scope id (#1826)
This is useful when we want to get the ast node that corresponds to the current scope.
This commit is contained in:
parent
ea8a59b6bc
commit
f7b7f0a512
2 changed files with 17 additions and 2 deletions
|
|
@ -415,10 +415,12 @@ impl<'a> SemanticBuilder<'a> {
|
||||||
AstKind::Function(func) => {
|
AstKind::Function(func) => {
|
||||||
self.function_stack.push(self.current_node_id);
|
self.function_stack.push(self.current_node_id);
|
||||||
func.bind(self);
|
func.bind(self);
|
||||||
|
self.add_node_id();
|
||||||
self.make_all_namespaces_valuelike();
|
self.make_all_namespaces_valuelike();
|
||||||
}
|
}
|
||||||
AstKind::ArrowExpression(_) => {
|
AstKind::ArrowExpression(_) => {
|
||||||
self.function_stack.push(self.current_node_id);
|
self.function_stack.push(self.current_node_id);
|
||||||
|
self.add_node_id();
|
||||||
self.make_all_namespaces_valuelike();
|
self.make_all_namespaces_valuelike();
|
||||||
}
|
}
|
||||||
AstKind::Class(class) => {
|
AstKind::Class(class) => {
|
||||||
|
|
@ -537,6 +539,10 @@ impl<'a> SemanticBuilder<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn add_node_id(&mut self) {
|
||||||
|
self.scope.add_node_id(self.current_scope_id, self.current_node_id);
|
||||||
|
}
|
||||||
|
|
||||||
fn make_all_namespaces_valuelike(&mut self) {
|
fn make_all_namespaces_valuelike(&mut self) {
|
||||||
for symbol_id in &self.namespace_stack {
|
for symbol_id in &self.namespace_stack {
|
||||||
// Ambient modules cannot be value modules
|
// Ambient modules cannot be value modules
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ use oxc_span::Atom;
|
||||||
pub use oxc_syntax::scope::{ScopeFlags, ScopeId};
|
pub use oxc_syntax::scope::{ScopeFlags, ScopeId};
|
||||||
use rustc_hash::{FxHashMap, FxHasher};
|
use rustc_hash::{FxHashMap, FxHasher};
|
||||||
|
|
||||||
use crate::{reference::ReferenceId, symbol::SymbolId};
|
use crate::{reference::ReferenceId, symbol::SymbolId, AstNodeId};
|
||||||
|
|
||||||
type FxIndexMap<K, V> = IndexMap<K, V, BuildHasherDefault<FxHasher>>;
|
type FxIndexMap<K, V> = IndexMap<K, V, BuildHasherDefault<FxHasher>>;
|
||||||
|
|
||||||
|
|
@ -24,7 +24,8 @@ pub struct ScopeTree {
|
||||||
|
|
||||||
/// Maps a scope to direct children scopes
|
/// Maps a scope to direct children scopes
|
||||||
child_ids: FxHashMap<ScopeId, Vec<ScopeId>>,
|
child_ids: FxHashMap<ScopeId, Vec<ScopeId>>,
|
||||||
|
// Maps a scope to its node id
|
||||||
|
node_ids: FxHashMap<ScopeId, AstNodeId>,
|
||||||
flags: IndexVec<ScopeId, ScopeFlags>,
|
flags: IndexVec<ScopeId, ScopeFlags>,
|
||||||
bindings: IndexVec<ScopeId, Bindings>,
|
bindings: IndexVec<ScopeId, Bindings>,
|
||||||
unresolved_references: IndexVec<ScopeId, UnresolvedReferences>,
|
unresolved_references: IndexVec<ScopeId, UnresolvedReferences>,
|
||||||
|
|
@ -111,6 +112,10 @@ impl ScopeTree {
|
||||||
&self.bindings[scope_id]
|
&self.bindings[scope_id]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_node_id(&self, scope_id: ScopeId) -> Option<&AstNodeId> {
|
||||||
|
self.node_ids.get(&scope_id)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn iter_bindings(&self) -> impl Iterator<Item = (ScopeId, SymbolId, Atom)> + '_ {
|
pub fn iter_bindings(&self) -> impl Iterator<Item = (ScopeId, SymbolId, Atom)> + '_ {
|
||||||
self.bindings.iter_enumerated().flat_map(|(scope_id, bindings)| {
|
self.bindings.iter_enumerated().flat_map(|(scope_id, bindings)| {
|
||||||
bindings.iter().map(move |(name, symbol_id)| (scope_id, *symbol_id, name.clone()))
|
bindings.iter().map(move |(name, symbol_id)| (scope_id, *symbol_id, name.clone()))
|
||||||
|
|
@ -134,6 +139,10 @@ impl ScopeTree {
|
||||||
scope_id
|
scope_id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn add_node_id(&mut self, scope_id: ScopeId, node_id: AstNodeId) {
|
||||||
|
self.node_ids.insert(scope_id, node_id);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn add_binding(&mut self, scope_id: ScopeId, name: Atom, symbol_id: SymbolId) {
|
pub fn add_binding(&mut self, scope_id: ScopeId, name: Atom, symbol_id: SymbolId) {
|
||||||
self.bindings[scope_id].insert(name, symbol_id);
|
self.bindings[scope_id].insert(name, symbol_id);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue