11use emmylua_parser:: {
2- LuaAssignStat , LuaAstNode , LuaAstToken , LuaForRangeStat , LuaForStat , LuaFuncStat ,
3- LuaLocalFuncStat , LuaLocalStat , LuaVarExpr ,
2+ LuaAssignStat , LuaAstNode , LuaAstToken , LuaForRangeStat , LuaForStat , LuaFuncStat , LuaIndexExpr ,
3+ LuaLocalFuncStat , LuaLocalStat , LuaSyntaxKind , LuaVarExpr ,
44} ;
55
66use crate :: {
@@ -63,7 +63,10 @@ pub fn analyze_assign_stat(analyzer: &mut DeclAnalyzer, stat: LuaAssignStat) ->
6363 name,
6464 file_id,
6565 range,
66- LuaDeclExtra :: Global { decl_type : None } ,
66+ LuaDeclExtra :: Global {
67+ kind : LuaSyntaxKind :: NameExpr . into ( ) ,
68+ decl_type : None ,
69+ } ,
6770 ) ;
6871
6972 analyzer. add_decl ( decl) ;
@@ -84,7 +87,7 @@ pub fn analyze_assign_stat(analyzer: &mut DeclAnalyzer, stat: LuaAssignStat) ->
8487 let file_id = analyzer. get_file_id ( ) ;
8588 let member = LuaMember :: new (
8689 LuaMemberOwner :: None ,
87- key,
90+ key. clone ( ) ,
8891 file_id,
8992 index_expr. get_syntax_id ( ) ,
9093 None ,
@@ -95,6 +98,49 @@ pub fn analyze_assign_stat(analyzer: &mut DeclAnalyzer, stat: LuaAssignStat) ->
9598 . db
9699 . get_reference_index_mut ( )
97100 . add_write_range ( file_id, index_expr. get_range ( ) ) ;
101+
102+ if let LuaMemberKey :: Name ( name) = & key {
103+ analyze_maybe_global_index_expr ( analyzer, index_expr, & name, None ) ;
104+ }
105+ }
106+ }
107+ }
108+
109+ Some ( ( ) )
110+ }
111+
112+ fn analyze_maybe_global_index_expr (
113+ analyzer : & mut DeclAnalyzer ,
114+ index_expr : & LuaIndexExpr ,
115+ index_name : & str ,
116+ typ : Option < LuaType > ,
117+ ) -> Option < ( ) > {
118+ let file_id = analyzer. get_file_id ( ) ;
119+ let prefix = index_expr. get_prefix_expr ( ) ?;
120+ if let LuaVarExpr :: NameExpr ( name_expr) = prefix {
121+ let name_token = name_expr. get_name_token ( ) ?;
122+ let name_token_text = name_token. get_name_text ( ) ;
123+ if name_token_text == "_G" || name_token_text == "_ENV" {
124+ let position = index_expr. get_position ( ) ;
125+ let name = name_token. get_name_text ( ) ;
126+ let range = index_expr. get_range ( ) ;
127+ if analyzer. find_decl ( & name, position) . is_none ( ) {
128+ let decl = LuaDecl :: new (
129+ index_name,
130+ file_id,
131+ range,
132+ LuaDeclExtra :: Global {
133+ kind : LuaSyntaxKind :: IndexExpr . into ( ) ,
134+ decl_type : typ,
135+ } ,
136+ ) ;
137+
138+ analyzer. add_decl ( decl) ;
139+ } else {
140+ analyzer
141+ . db
142+ . get_reference_index_mut ( )
143+ . add_write_range ( file_id, range) ;
98144 }
99145 }
100146 }
@@ -167,7 +213,10 @@ pub fn analyze_func_stat(analyzer: &mut DeclAnalyzer, stat: LuaFuncStat) -> Opti
167213 name,
168214 file_id,
169215 range,
170- LuaDeclExtra :: Global { decl_type : None } ,
216+ LuaDeclExtra :: Global {
217+ kind : LuaSyntaxKind :: NameExpr . into ( ) ,
218+ decl_type : None ,
219+ } ,
171220 ) ;
172221
173222 let decl_id = analyzer. add_decl ( decl) ;
@@ -176,8 +225,8 @@ pub fn analyze_func_stat(analyzer: &mut DeclAnalyzer, stat: LuaFuncStat) -> Opti
176225 return Some ( ( ) ) ;
177226 }
178227 }
179- LuaVarExpr :: IndexExpr ( index_name ) => {
180- let index_key = index_name . get_index_key ( ) ?;
228+ LuaVarExpr :: IndexExpr ( index_expr ) => {
229+ let index_key = index_expr . get_index_key ( ) ?;
181230 let key: LuaMemberKey = index_key. into ( ) ;
182231 if key. is_none ( ) {
183232 return None ;
@@ -186,17 +235,21 @@ pub fn analyze_func_stat(analyzer: &mut DeclAnalyzer, stat: LuaFuncStat) -> Opti
186235 let file_id = analyzer. get_file_id ( ) ;
187236 let member = LuaMember :: new (
188237 LuaMemberOwner :: None ,
189- key,
238+ key. clone ( ) ,
190239 file_id,
191- index_name . get_syntax_id ( ) ,
240+ index_expr . get_syntax_id ( ) ,
192241 None ,
193242 ) ;
194243
195244 let member_id = analyzer. db . get_member_index_mut ( ) . add_member ( member) ;
196245 analyzer
197246 . db
198247 . get_reference_index_mut ( )
199- . add_write_range ( file_id, index_name. get_range ( ) ) ;
248+ . add_write_range ( file_id, index_expr. get_range ( ) ) ;
249+
250+ if let LuaMemberKey :: Name ( name) = & key {
251+ analyze_maybe_global_index_expr ( analyzer, & index_expr, & name, None ) ;
252+ }
200253 LuaPropertyOwnerId :: Member ( member_id)
201254 }
202255 } ;
0 commit comments