Skip to content

Commit f279da5

Browse files
committed
Fix #660
1 parent c7f284a commit f279da5

File tree

6 files changed

+50
-16
lines changed

6 files changed

+50
-16
lines changed

crates/emmylua_code_analysis/src/diagnostic/checker/assign_type_mismatch.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ fn check_index_expr(
131131
) -> Option<()> {
132132
let source_type = infer_index_expr(
133133
semantic_model.get_db(),
134-
&mut semantic_model.get_config().borrow_mut(),
134+
&mut semantic_model.get_cache().borrow_mut(),
135135
index_expr.clone(),
136136
false,
137137
)

crates/emmylua_code_analysis/src/diagnostic/checker/check_field.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -192,17 +192,18 @@ fn is_valid_member(
192192
let need_add_diagnostic =
193193
match semantic_model.get_semantic_info(index_expr.syntax().clone().into()) {
194194
Some(info) => {
195-
let need = info.semantic_decl.is_none() && info.typ.is_unknown();
195+
let mut need = info.semantic_decl.is_none();
196+
if need {
197+
let decl_type = semantic_model.get_index_decl_type(index_expr.clone());
198+
if let Some(typ) = decl_type {
199+
if !typ.is_unknown() {
200+
need = false;
201+
}
202+
}
203+
}
204+
196205
// TODO: 元组类型的检查或许需要独立出来
197206
if !need && matches!(code, DiagnosticCode::InjectField) {
198-
// if let LuaType::Tuple(tuple) = prefix_typ {
199-
// if tuple.is_infer_resolve() {
200-
// return Some(());
201-
// } else {
202-
// // 元组类型禁止修改
203-
// return None;
204-
// }
205-
// }
206207
// 前缀是导入的表常量, 检查定义的文件是否与导入的表常量相同, 不同则认为是非法的
207208
if let Some(module_info) = module_info {
208209
if let Some(LuaSemanticDeclId::Member(member_id)) = info.semantic_decl {
@@ -497,7 +498,7 @@ fn check_enum_is_param(
497498
) -> Option<()> {
498499
enum_variable_is_param(
499500
semantic_model.get_db(),
500-
&mut semantic_model.get_config().borrow_mut(),
501+
&mut semantic_model.get_cache().borrow_mut(),
501502
index_expr,
502503
prefix_typ,
503504
)

crates/emmylua_code_analysis/src/diagnostic/test/inject_field_test.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,4 +208,32 @@ mod test {
208208
"#,
209209
));
210210
}
211+
212+
#[test]
213+
fn test_issue_660() {
214+
let mut ws = VirtualWorkspace::new();
215+
ws.def_file(
216+
"a.lua",
217+
r#"
218+
--- @class (private) vim.var_accessor
219+
--- @field [string] any
220+
--- @field [integer] vim.var_accessor
221+
222+
vim = {}
223+
224+
---@type vim.var_accessor
225+
vim.g = {}
226+
"#,
227+
);
228+
assert!(ws.check_code_for(
229+
DiagnosticCode::InjectField,
230+
r#"
231+
if vim.g.aaa then
232+
return
233+
end
234+
235+
vim.g.aaa = true
236+
"#,
237+
));
238+
}
211239
}

crates/emmylua_code_analysis/src/semantic/mod.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ use std::{collections::HashSet, sync::Arc};
1616
pub use cache::{CacheEntry, CacheOptions, LuaAnalysisPhase, LuaInferCache};
1717
pub use decl::{enum_variable_is_param, parse_require_module_info};
1818
use emmylua_parser::{
19-
LuaCallExpr, LuaChunk, LuaExpr, LuaIndexKey, LuaParseError, LuaSyntaxNode, LuaSyntaxToken,
20-
LuaTableExpr,
19+
LuaCallExpr, LuaChunk, LuaExpr, LuaIndexExpr, LuaIndexKey, LuaParseError, LuaSyntaxNode,
20+
LuaSyntaxToken, LuaTableExpr,
2121
};
2222
pub use infer::infer_index_expr;
2323
use infer::{infer_bind_value_type, infer_expr_list_types};
@@ -268,7 +268,7 @@ impl<'a> SemanticModel<'a> {
268268
self.file_id
269269
}
270270

271-
pub fn get_config(&self) -> &RefCell<LuaInferCache> {
271+
pub fn get_cache(&self) -> &RefCell<LuaInferCache> {
272272
&self.infer_cache
273273
}
274274

@@ -296,6 +296,11 @@ impl<'a> SemanticModel<'a> {
296296
pub fn get_member_origin_owner(&self, member_id: LuaMemberId) -> Option<LuaSemanticDeclId> {
297297
find_member_origin_owner(self.db, &mut self.infer_cache.borrow_mut(), member_id)
298298
}
299+
300+
pub fn get_index_decl_type(&self, index_expr: LuaIndexExpr) -> Option<LuaType> {
301+
let cache = &mut self.infer_cache.borrow_mut();
302+
infer_index_expr(self.db, cache, index_expr, false).ok()
303+
}
299304
}
300305

301306
/// Guard to prevent infinite recursion

crates/emmylua_ls/src/handlers/completion/providers/member_provider.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ pub fn add_completion(builder: &mut CompletionBuilder) -> Option<()> {
3131
// 如果是枚举类型且为函数参数, 则不进行补全
3232
if enum_variable_is_param(
3333
builder.semantic_model.get_db(),
34-
&mut builder.semantic_model.get_config().borrow_mut(),
34+
&mut builder.semantic_model.get_cache().borrow_mut(),
3535
&index_expr,
3636
&prefix_type,
3737
)

crates/emmylua_ls/src/handlers/definition/goto_function.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ pub fn compare_function_types(
114114
if func.contain_tpl() {
115115
let instantiated_func = instantiate_func_generic(
116116
semantic_model.get_db(),
117-
&mut semantic_model.get_config().borrow_mut(),
117+
&mut semantic_model.get_cache().borrow_mut(),
118118
func,
119119
call_expr.clone(),
120120
)

0 commit comments

Comments
 (0)