File tree Expand file tree Collapse file tree 2 files changed +34
-2
lines changed
crates/emmylua_code_analysis/src
compilation/analyzer/flow Expand file tree Collapse file tree 2 files changed +34
-2
lines changed Original file line number Diff line number Diff line change @@ -67,7 +67,7 @@ fn build_name_expr_flow(
6767) -> Option < ( ) > {
6868 let parent = name_expr. get_parent :: < LuaAst > ( ) ?;
6969 let mut is_assign = false ;
70- match parent {
70+ match & parent {
7171 LuaAst :: LuaIndexExpr ( _) | LuaAst :: LuaCallExpr ( _) | LuaAst :: LuaFuncStat ( _) => return None ,
7272 LuaAst :: LuaAssignStat ( assign_stat) => {
7373 let eq_pos = assign_stat
@@ -87,7 +87,20 @@ fn build_name_expr_flow(
8787 let mut ref_id: Option < VarRefId > = None ;
8888 if let Some ( local_refs) = db. get_reference_index ( ) . get_local_reference ( & file_id) {
8989 if let Some ( decl_id) = local_refs. get_decl_id ( & name_expr. get_range ( ) ) {
90- ref_id = Some ( VarRefId :: DeclId ( decl_id. clone ( ) ) ) ;
90+ if let Some ( decl) = db. get_decl_index ( ) . get_decl ( & decl_id) {
91+ // 处理`self`作为参数传入的特殊情况
92+ if decl. is_param ( )
93+ && name_expr
94+ . get_name_text ( )
95+ . map_or ( false , |name| name == "self" )
96+ {
97+ ref_id = Some ( VarRefId :: Name ( SmolStr :: new ( "self" ) ) ) ;
98+ } else {
99+ ref_id = Some ( VarRefId :: DeclId ( decl_id. clone ( ) ) ) ;
100+ }
101+ } else {
102+ ref_id = Some ( VarRefId :: DeclId ( decl_id. clone ( ) ) ) ;
103+ }
91104 }
92105 }
93106
Original file line number Diff line number Diff line change @@ -33,4 +33,23 @@ mod test {
3333 "#
3434 ) ) ;
3535 }
36+
37+ #[ test]
38+ fn test_issue_402 ( ) {
39+ let mut ws = VirtualWorkspace :: new ( ) ;
40+ assert ! ( ws. check_code_for(
41+ DiagnosticCode :: NeedCheckNil ,
42+ r#"
43+ ---@class A
44+ local a = {}
45+
46+ ---@param self table?
47+ function a.new(self)
48+ if self then
49+ self.a = 1
50+ end
51+ end
52+ "#
53+ ) ) ;
54+ }
3655}
You can’t perform that action at this time.
0 commit comments