Skip to main content

luaur_analysis/methods/
scope_lookup_ex_scope.rs

1use crate::records::def::Def;
2use crate::records::scope::Scope;
3use crate::type_aliases::def_id_def::DefId;
4use crate::type_aliases::type_id::TypeId;
5
6impl Scope {
7    pub fn lookup_ex_def_id(&mut self, def: DefId) -> Option<(TypeId, *mut Scope)> {
8        let mut s: *mut Scope = self as *mut Scope;
9
10        loop {
11            let lvalue_types = unsafe { &(*s).lvalue_types };
12            if let Some(type_id) = lvalue_types.get(&def) {
13                return Some((*type_id, s));
14            }
15
16            let rvalue_refinements = unsafe { &(*s).rvalue_refinements };
17            if let Some(type_id) = rvalue_refinements.get(&def) {
18                return Some((*type_id, s));
19            }
20
21            let parent = unsafe { &(*s).parent };
22            match parent {
23                Some(parent_scope) => {
24                    s = parent_scope.as_ref() as *const Scope as *mut Scope;
25                }
26                None => {
27                    return None;
28                }
29            }
30        }
31    }
32}