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:
Makoto Tateno 2023-08-05 13:45:22 +09:00 committed by GitHub
parent d1531cd144
commit c5ff534b08
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 23 additions and 8 deletions

View file

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

View file

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

View file

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

View file

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