1- use emmylua_parser:: { LuaAssignStat , LuaAst , LuaAstNode , LuaVarExpr } ;
1+ use emmylua_parser:: { LuaAssignStat , LuaAst , LuaAstNode , LuaExpr , LuaSyntaxId , LuaSyntaxKind } ;
22use rowan:: { NodeOrToken , TextRange } ;
33
44use crate :: {
5- DiagnosticCode , LuaSemanticDeclId , PropertyDeclFeature , SemanticDeclLevel , SemanticModel ,
5+ DiagnosticCode , LuaDeclId , LuaMemberId , LuaSemanticDeclId , PropertyDeclFeature ,
6+ SemanticDeclLevel , SemanticModel ,
67} ;
78
89use 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
0 commit comments