oxc_semantic/
is_global_reference.rs

1use oxc_ast::ast::{Expression, IdentifierReference};
2
3use crate::{ReferenceId, Scoping};
4
5/// Checks whether the a identifier reference is a global value or not.
6pub 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}