|
1 | 1 | use emmylua_parser::{ |
2 | | - LuaAstNode, LuaAstToken, LuaClosureExpr, LuaExpr, LuaIndexExpr, LuaNameExpr, LuaStat, |
3 | | - LuaSyntaxKind, |
| 2 | + LuaAstNode, LuaAstToken, LuaCallExpr, LuaClosureExpr, LuaExpr, LuaIndexExpr, LuaLiteralToken, |
| 3 | + LuaNameExpr, LuaStat, LuaSyntaxKind, |
4 | 4 | }; |
5 | 5 |
|
6 | 6 | use crate::{ |
@@ -84,31 +84,63 @@ fn infer_name_expr_semantic_decl( |
84 | 84 | return Some(LuaSemanticDeclId::LuaDecl(decl_id)); |
85 | 85 | } |
86 | 86 |
|
87 | | - // should continue infer require? |
88 | | - if let Some(value_expr_id) = decl.get_value_syntax_id() |
89 | | - && matches!( |
90 | | - value_expr_id.get_kind(), |
91 | | - LuaSyntaxKind::NameExpr | LuaSyntaxKind::IndexExpr |
92 | | - ) |
93 | | - { |
94 | | - let file_id = decl.get_file_id(); |
95 | | - let tree = db.get_vfs().get_syntax_tree(&file_id)?; |
96 | | - // second infer |
97 | | - let value_expr = LuaExpr::cast(value_expr_id.to_node(tree)?)?; |
98 | | - if let Some(property_owner_id) = infer_expr_semantic_decl( |
99 | | - db, |
100 | | - cache, |
101 | | - value_expr, |
102 | | - semantic_guard.next_level()?, |
103 | | - level.next_level()?, |
104 | | - ) { |
105 | | - return Some(property_owner_id); |
| 87 | + if let Some(value_expr_id) = decl.get_value_syntax_id() { |
| 88 | + match value_expr_id.get_kind() { |
| 89 | + LuaSyntaxKind::NameExpr | LuaSyntaxKind::IndexExpr => { |
| 90 | + let file_id = decl.get_file_id(); |
| 91 | + let tree = db.get_vfs().get_syntax_tree(&file_id)?; |
| 92 | + // second infer |
| 93 | + let value_expr = LuaExpr::cast(value_expr_id.to_node(tree)?)?; |
| 94 | + if let Some(semantic_id) = infer_expr_semantic_decl( |
| 95 | + db, |
| 96 | + cache, |
| 97 | + value_expr, |
| 98 | + semantic_guard.next_level()?, |
| 99 | + level.next_level()?, |
| 100 | + ) { |
| 101 | + return Some(semantic_id); |
| 102 | + } |
| 103 | + } |
| 104 | + LuaSyntaxKind::RequireCallExpr => { |
| 105 | + let file_id = decl.get_file_id(); |
| 106 | + let tree = db.get_vfs().get_syntax_tree(&file_id)?; |
| 107 | + let call_expr = LuaCallExpr::cast(value_expr_id.to_node(tree)?)?; |
| 108 | + if call_expr.is_require() { |
| 109 | + if let Some(semantic_id) = infer_require_module_semantic_decl(db, call_expr) { |
| 110 | + return Some(semantic_id); |
| 111 | + } |
| 112 | + } |
| 113 | + } |
| 114 | + _ => {} |
106 | 115 | } |
107 | 116 | } |
108 | 117 |
|
109 | 118 | Some(LuaSemanticDeclId::LuaDecl(decl_id)) |
110 | 119 | } |
111 | 120 |
|
| 121 | +fn infer_require_module_semantic_decl( |
| 122 | + db: &DbIndex, |
| 123 | + call_expr: LuaCallExpr, |
| 124 | +) -> Option<LuaSemanticDeclId> { |
| 125 | + let first_arg = call_expr.get_args_list()?.get_args().next()?; |
| 126 | + let module_path = match first_arg { |
| 127 | + LuaExpr::LiteralExpr(literal_expr) => { |
| 128 | + if let Some(literal_token) = literal_expr.get_literal() { |
| 129 | + match literal_token { |
| 130 | + LuaLiteralToken::String(string_token) => string_token.get_value(), |
| 131 | + _ => return None, |
| 132 | + } |
| 133 | + } else { |
| 134 | + return None; |
| 135 | + } |
| 136 | + } |
| 137 | + _ => return None, |
| 138 | + }; |
| 139 | + |
| 140 | + let module_info = db.get_module_index().find_module(&module_path)?; |
| 141 | + module_info.semantic_id.clone() |
| 142 | +} |
| 143 | + |
112 | 144 | fn get_name_decl_id( |
113 | 145 | db: &DbIndex, |
114 | 146 | cache: &mut LuaInferCache, |
|
0 commit comments