Skip to main content

luaur_analysis/methods/
require_tracer_get_dependent.rs

1use crate::records::require_tracer::RequireTracer;
2use luaur_ast::records::ast_expr_call::AstExprCall;
3use luaur_ast::records::ast_expr_group::AstExprGroup;
4use luaur_ast::records::ast_expr_index_expr::AstExprIndexExpr;
5use luaur_ast::records::ast_expr_index_name::AstExprIndexName;
6use luaur_ast::records::ast_expr_local::AstExprLocal;
7use luaur_ast::records::ast_expr_type_assertion::AstExprTypeAssertion;
8use luaur_ast::records::ast_node::AstNode;
9use luaur_ast::records::ast_type_group::AstTypeGroup;
10use luaur_ast::records::ast_type_typeof::AstTypeTypeof;
11use luaur_common::records::dense_hash_map::DenseHashMap;
12
13impl RequireTracer {
14    pub fn get_dependent(&self, node: *mut AstNode) -> *mut AstNode {
15        unsafe {
16            if (*node).is::<AstExprLocal>() {
17                let expr = node as *mut AstExprLocal;
18                let local = (*expr).local;
19                match self.locals.find(&local) {
20                    Some(&val) => return val as *mut AstNode,
21                    None => return core::ptr::null_mut(),
22                }
23            } else if (*node).is::<AstExprIndexName>() {
24                let expr = node as *mut AstExprIndexName;
25                return (*expr).expr as *mut AstNode;
26            } else if (*node).is::<AstExprIndexExpr>() {
27                let expr = node as *mut AstExprIndexExpr;
28                return (*expr).expr as *mut AstNode;
29            } else if (*node).is::<AstExprCall>() {
30                let expr = node as *mut AstExprCall;
31                if (*expr).self_ {
32                    let func = (*expr).func as *mut AstExprIndexName;
33                    return (*func).expr as *mut AstNode;
34                }
35            } else if (*node).is::<AstExprGroup>() {
36                let expr = node as *mut AstExprGroup;
37                return (*expr).expr as *mut AstNode;
38            } else if (*node).is::<AstExprTypeAssertion>() {
39                let expr = node as *mut AstExprTypeAssertion;
40                return (*expr).annotation as *mut AstNode;
41            } else if (*node).is::<AstTypeGroup>() {
42                let expr = node as *mut AstTypeGroup;
43                return (*expr).type_ as *mut AstNode;
44            } else if (*node).is::<AstTypeTypeof>() {
45                let expr = node as *mut AstTypeTypeof;
46                return (*expr).expr as *mut AstNode;
47            }
48        }
49        core::ptr::null_mut()
50    }
51}