Skip to content

Commit 1314197

Browse files
committed
readonly check can pass by require
1 parent 41cec0a commit 1314197

File tree

1 file changed

+53
-21
lines changed

1 file changed

+53
-21
lines changed

crates/emmylua_code_analysis/src/semantic/semantic_info/infer_expr_semantic_decl.rs

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
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,
44
};
55

66
use crate::{
@@ -84,31 +84,63 @@ fn infer_name_expr_semantic_decl(
8484
return Some(LuaSemanticDeclId::LuaDecl(decl_id));
8585
}
8686

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+
_ => {}
106115
}
107116
}
108117

109118
Some(LuaSemanticDeclId::LuaDecl(decl_id))
110119
}
111120

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+
112144
fn get_name_decl_id(
113145
db: &DbIndex,
114146
cache: &mut LuaInferCache,

0 commit comments

Comments
 (0)