Skip to content

Commit 41cec0a

Browse files
committed
update readonly check
1 parent 0c7b4f2 commit 41cec0a

File tree

2 files changed

+37
-24
lines changed

2 files changed

+37
-24
lines changed

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

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
use emmylua_parser::{LuaAssignStat, LuaAst, LuaAstNode, LuaVarExpr};
1+
use emmylua_parser::{LuaAssignStat, LuaAst, LuaAstNode, LuaExpr, LuaSyntaxId, LuaSyntaxKind};
22
use rowan::{NodeOrToken, TextRange};
33

44
use crate::{
5-
DiagnosticCode, LuaSemanticDeclId, PropertyDeclFeature, SemanticDeclLevel, SemanticModel,
5+
DiagnosticCode, LuaDeclId, LuaMemberId, LuaSemanticDeclId, PropertyDeclFeature,
6+
SemanticDeclLevel, SemanticModel,
67
};
78

89
use super::{Checker, DiagnosticContext};
@@ -34,6 +35,23 @@ fn check_and_report_semantic_id(
3435
range: TextRange,
3536
semantic_decl_id: LuaSemanticDeclId,
3637
) -> Option<()> {
38+
match semantic_decl_id {
39+
LuaSemanticDeclId::LuaDecl(decl_id) => {
40+
let self_decl_id = LuaDeclId::new(context.file_id, range.start());
41+
if decl_id == self_decl_id {
42+
return None;
43+
}
44+
}
45+
LuaSemanticDeclId::Member(member_id) => {
46+
let syntax_id = LuaSyntaxId::new(LuaSyntaxKind::IndexExpr.into(), range);
47+
let self_member_id = LuaMemberId::new(syntax_id, context.file_id);
48+
if member_id == self_member_id {
49+
return None;
50+
}
51+
}
52+
_ => {}
53+
}
54+
3755
// TODO filter self
3856
let property_index = context.db.get_property_index();
3957
if let Some(property) = property_index.get_property(&semantic_decl_id) {
@@ -60,28 +78,22 @@ fn check_assign_stat(
6078
) -> Option<()> {
6179
let (vars, _) = assign_stat.get_var_and_expr_list();
6280
for var in vars {
63-
let node_or_token = NodeOrToken::Node(var.syntax().clone());
64-
let semantic_decl_id =
65-
semantic_model.find_decl(node_or_token, SemanticDeclLevel::default());
66-
if let Some(semantic_decl_id) = semantic_decl_id {
67-
check_and_report_semantic_id(context, var.get_range(), semantic_decl_id);
68-
}
69-
70-
match var {
71-
LuaVarExpr::IndexExpr(index_expr) => {
72-
let prefix_node = index_expr.get_prefix_expr()?;
73-
let node_or_token = NodeOrToken::Node(prefix_node.syntax().clone());
74-
let semantic_decl_id =
75-
semantic_model.find_decl(node_or_token, SemanticDeclLevel::default());
76-
if let Some(semantic_decl_id) = semantic_decl_id {
77-
check_and_report_semantic_id(
78-
context,
79-
prefix_node.get_range(),
80-
semantic_decl_id,
81-
);
81+
let mut var = LuaExpr::cast(var.syntax().clone())?;
82+
loop {
83+
let node_or_token = NodeOrToken::Node(var.syntax().clone());
84+
let semantic_decl_id =
85+
semantic_model.find_decl(node_or_token, SemanticDeclLevel::default());
86+
if let Some(semantic_decl_id) = semantic_decl_id {
87+
check_and_report_semantic_id(context, var.get_range(), semantic_decl_id);
88+
}
89+
match var {
90+
LuaExpr::IndexExpr(index_expr) => {
91+
var = index_expr.get_prefix_expr()?;
92+
}
93+
_ => {
94+
break;
8295
}
8396
}
84-
_ => {}
8597
}
8698
}
8799

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,15 +75,16 @@ fn infer_name_expr_semantic_decl(
7575
.get_type_index()
7676
.get_type_cache(&decl_id.into())
7777
.unwrap_or(&LuaTypeCache::InferType(LuaType::Unknown));
78-
let is_function = decl_type.is_function();
79-
if decl.is_local() && !is_function {
78+
let is_ref_object = decl_type.is_function() || decl_type.is_table();
79+
if decl.is_local() && !is_ref_object {
8080
return Some(LuaSemanticDeclId::LuaDecl(decl_id));
8181
}
8282

8383
if level.reached_limit() {
8484
return Some(LuaSemanticDeclId::LuaDecl(decl_id));
8585
}
8686

87+
// should continue infer require?
8788
if let Some(value_expr_id) = decl.get_value_syntax_id()
8889
&& matches!(
8990
value_expr_id.get_kind(),

0 commit comments

Comments
 (0)