mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 20:32:10 +00:00
feat(semantic): add node_id to Reference (#689)
Closes #685 Intend to use this in the following ways in #672. ```rs let node = ctx.nodes().get_node(reference.node_id()); if !self.type_of && has_typeof_operator(node, ctx) { return; } ```
This commit is contained in:
parent
d1531cd144
commit
c5ff534b08
4 changed files with 23 additions and 8 deletions
|
|
@ -50,7 +50,8 @@ impl<'a> AstLower<'a> {
|
||||||
name: &Atom,
|
name: &Atom,
|
||||||
reference_flag: ReferenceFlag,
|
reference_flag: ReferenceFlag,
|
||||||
) -> ReferenceId {
|
) -> ReferenceId {
|
||||||
let reference = Reference::new(span, name.clone(), reference_flag);
|
let reference =
|
||||||
|
Reference::new(span, name.clone(), self.semantic.current_node_id, reference_flag);
|
||||||
self.semantic.declare_reference(reference)
|
self.semantic.declare_reference(reference)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -90,7 +90,12 @@ impl<'a> Visit<'a> for ManglerBuilder<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn visit_identifier_reference(&mut self, ident: &'a IdentifierReference) {
|
fn visit_identifier_reference(&mut self, ident: &'a IdentifierReference) {
|
||||||
let reference = Reference::new(ident.span, ident.name.clone(), ReferenceFlag::read());
|
let reference = Reference::new(
|
||||||
|
ident.span,
|
||||||
|
ident.name.clone(),
|
||||||
|
self.semantic.current_node_id,
|
||||||
|
ReferenceFlag::read(),
|
||||||
|
);
|
||||||
let reference_id = self.semantic.declare_reference(reference);
|
let reference_id = self.semantic.declare_reference(reference);
|
||||||
ident.reference_id.replace(reference_id);
|
ident.reference_id.replace(reference_id);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -571,7 +571,7 @@ impl<'a> SemanticBuilder<'a> {
|
||||||
|
|
||||||
fn reference_identifier(&mut self, ident: &IdentifierReference) {
|
fn reference_identifier(&mut self, ident: &IdentifierReference) {
|
||||||
let flag = self.resolve_reference_usages();
|
let flag = self.resolve_reference_usages();
|
||||||
let reference = Reference::new(ident.span, ident.name.clone(), flag);
|
let reference = Reference::new(ident.span, ident.name.clone(), self.current_node_id, flag);
|
||||||
self.declare_reference(reference);
|
self.declare_reference(reference);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -655,8 +655,12 @@ impl<'a> SemanticBuilder<'a> {
|
||||||
JSXElementName::MemberExpression(expr) => Some(expr.get_object_identifier()),
|
JSXElementName::MemberExpression(expr) => Some(expr.get_object_identifier()),
|
||||||
_ => None,
|
_ => None,
|
||||||
} {
|
} {
|
||||||
let reference =
|
let reference = Reference::new(
|
||||||
Reference::new(ident.span, ident.name.clone(), ReferenceFlag::read());
|
ident.span,
|
||||||
|
ident.name.clone(),
|
||||||
|
self.current_node_id,
|
||||||
|
ReferenceFlag::read(),
|
||||||
|
);
|
||||||
self.declare_reference(reference);
|
self.declare_reference(reference);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ use bitflags::bitflags;
|
||||||
use oxc_index::define_index_type;
|
use oxc_index::define_index_type;
|
||||||
use oxc_span::{Atom, Span};
|
use oxc_span::{Atom, Span};
|
||||||
|
|
||||||
use crate::symbol::SymbolId;
|
use crate::{symbol::SymbolId, AstNodeId};
|
||||||
|
|
||||||
define_index_type! {
|
define_index_type! {
|
||||||
pub struct ReferenceId = u32;
|
pub struct ReferenceId = u32;
|
||||||
|
|
@ -13,6 +13,7 @@ pub struct Reference {
|
||||||
span: Span,
|
span: Span,
|
||||||
/// The name of the identifier that was referred to
|
/// The name of the identifier that was referred to
|
||||||
name: Atom,
|
name: Atom,
|
||||||
|
node_id: AstNodeId,
|
||||||
symbol_id: Option<SymbolId>,
|
symbol_id: Option<SymbolId>,
|
||||||
/// Describes how this referenced is used by other AST nodes. References can
|
/// Describes how this referenced is used by other AST nodes. References can
|
||||||
/// be reads, writes, or both.
|
/// be reads, writes, or both.
|
||||||
|
|
@ -20,8 +21,8 @@ pub struct Reference {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Reference {
|
impl Reference {
|
||||||
pub fn new(span: Span, name: Atom, flag: ReferenceFlag) -> Self {
|
pub fn new(span: Span, name: Atom, node_id: AstNodeId, flag: ReferenceFlag) -> Self {
|
||||||
Self { span, name, symbol_id: None, flag }
|
Self { span, name, node_id, symbol_id: None, flag }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn span(&self) -> Span {
|
pub fn span(&self) -> Span {
|
||||||
|
|
@ -32,6 +33,10 @@ impl Reference {
|
||||||
&self.name
|
&self.name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn node_id(&self) -> AstNodeId {
|
||||||
|
self.node_id
|
||||||
|
}
|
||||||
|
|
||||||
pub fn symbol_id(&self) -> Option<SymbolId> {
|
pub fn symbol_id(&self) -> Option<SymbolId> {
|
||||||
self.symbol_id
|
self.symbol_id
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue