oxc_semantic/
is_global_reference.rs1use oxc_ast::ast::{Expression, IdentifierReference};
2
3use crate::{ReferenceId, Scoping};
4
5pub trait IsGlobalReference {
7 fn is_global_reference(&self, scoping: &Scoping) -> bool;
8 fn is_global_reference_name(&self, name: &str, scoping: &Scoping) -> bool;
9}
10
11impl IsGlobalReference for ReferenceId {
12 fn is_global_reference(&self, scoping: &Scoping) -> bool {
13 scoping.references[*self].symbol_id().is_none()
14 }
15
16 fn is_global_reference_name(&self, _name: &str, _scoping: &Scoping) -> bool {
17 panic!("This function is pointless to be called.");
18 }
19}
20
21impl IsGlobalReference for IdentifierReference<'_> {
22 fn is_global_reference(&self, scoping: &Scoping) -> bool {
23 self.reference_id
24 .get()
25 .is_some_and(|reference_id| reference_id.is_global_reference(scoping))
26 }
27
28 fn is_global_reference_name(&self, name: &str, scoping: &Scoping) -> bool {
29 self.name == name && self.is_global_reference(scoping)
30 }
31}
32
33impl IsGlobalReference for Expression<'_> {
34 fn is_global_reference(&self, scoping: &Scoping) -> bool {
35 if let Expression::Identifier(ident) = self {
36 return ident.is_global_reference(scoping);
37 }
38 false
39 }
40
41 fn is_global_reference_name(&self, name: &str, scoping: &Scoping) -> bool {
42 if let Expression::Identifier(ident) = self {
43 return ident.is_global_reference_name(name, scoping);
44 }
45 false
46 }
47}