mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 12:21:58 +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,
|
||||
reference_flag: ReferenceFlag,
|
||||
) -> 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)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -90,7 +90,12 @@ impl<'a> Visit<'a> for ManglerBuilder<'a> {
|
|||
}
|
||||
|
||||
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);
|
||||
ident.reference_id.replace(reference_id);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -571,7 +571,7 @@ impl<'a> SemanticBuilder<'a> {
|
|||
|
||||
fn reference_identifier(&mut self, ident: &IdentifierReference) {
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
@ -655,8 +655,12 @@ impl<'a> SemanticBuilder<'a> {
|
|||
JSXElementName::MemberExpression(expr) => Some(expr.get_object_identifier()),
|
||||
_ => None,
|
||||
} {
|
||||
let reference =
|
||||
Reference::new(ident.span, ident.name.clone(), ReferenceFlag::read());
|
||||
let reference = Reference::new(
|
||||
ident.span,
|
||||
ident.name.clone(),
|
||||
self.current_node_id,
|
||||
ReferenceFlag::read(),
|
||||
);
|
||||
self.declare_reference(reference);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ use bitflags::bitflags;
|
|||
use oxc_index::define_index_type;
|
||||
use oxc_span::{Atom, Span};
|
||||
|
||||
use crate::symbol::SymbolId;
|
||||
use crate::{symbol::SymbolId, AstNodeId};
|
||||
|
||||
define_index_type! {
|
||||
pub struct ReferenceId = u32;
|
||||
|
|
@ -13,6 +13,7 @@ pub struct Reference {
|
|||
span: Span,
|
||||
/// The name of the identifier that was referred to
|
||||
name: Atom,
|
||||
node_id: AstNodeId,
|
||||
symbol_id: Option<SymbolId>,
|
||||
/// Describes how this referenced is used by other AST nodes. References can
|
||||
/// be reads, writes, or both.
|
||||
|
|
@ -20,8 +21,8 @@ pub struct Reference {
|
|||
}
|
||||
|
||||
impl Reference {
|
||||
pub fn new(span: Span, name: Atom, flag: ReferenceFlag) -> Self {
|
||||
Self { span, name, symbol_id: None, flag }
|
||||
pub fn new(span: Span, name: Atom, node_id: AstNodeId, flag: ReferenceFlag) -> Self {
|
||||
Self { span, name, node_id, symbol_id: None, flag }
|
||||
}
|
||||
|
||||
pub fn span(&self) -> Span {
|
||||
|
|
@ -32,6 +33,10 @@ impl Reference {
|
|||
&self.name
|
||||
}
|
||||
|
||||
pub fn node_id(&self) -> AstNodeId {
|
||||
self.node_id
|
||||
}
|
||||
|
||||
pub fn symbol_id(&self) -> Option<SymbolId> {
|
||||
self.symbol_id
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue