11use std:: collections:: HashMap ;
22
33use emmylua_code_analysis:: {
4- LuaCompilation , LuaDeclId , LuaMemberId , LuaMemberKey , LuaSemanticDeclId , LuaTypeDeclId ,
5- SemanticDeclLevel , SemanticModel ,
4+ DeclReference , LuaCompilation , LuaDeclId , LuaMemberId , LuaMemberKey , LuaSemanticDeclId ,
5+ LuaTypeDeclId , SemanticDeclLevel , SemanticModel ,
66} ;
77use emmylua_parser:: {
8- LuaAst , LuaAstNode , LuaAstToken , LuaNameToken , LuaStringToken , LuaSyntaxNode , LuaSyntaxToken ,
8+ LuaAssignStat , LuaAst , LuaAstNode , LuaAstToken , LuaNameToken , LuaStringToken , LuaSyntaxNode ,
9+ LuaSyntaxToken ,
910} ;
1011use lsp_types:: Location ;
1112
@@ -20,7 +21,7 @@ pub fn search_references(
2021 {
2122 match semantic_decl {
2223 LuaSemanticDeclId :: LuaDecl ( decl_id) => {
23- search_decl_references ( semantic_model, decl_id, & mut result) ;
24+ search_decl_references ( semantic_model, compilation , decl_id, & mut result) ;
2425 }
2526 LuaSemanticDeclId :: Member ( member_id) => {
2627 search_member_references ( semantic_model, compilation, member_id, & mut result) ;
@@ -41,6 +42,7 @@ pub fn search_references(
4142
4243pub fn search_decl_references (
4344 semantic_model : & SemanticModel ,
45+ compilation : & LuaCompilation ,
4446 decl_id : LuaDeclId ,
4547 result : & mut Vec < Location > ,
4648) -> Option < ( ) > {
@@ -58,9 +60,15 @@ pub fn search_decl_references(
5860 if let Some ( location) = document. to_lsp_location ( decl. get_range ( ) ) {
5961 result. push ( location) ;
6062 }
63+ let typ = semantic_model. get_type ( decl. get_id ( ) . into ( ) ) ;
64+ let is_signature = typ. is_signature ( ) ;
65+
6166 for decl_ref in decl_refs {
6267 let location = document. to_lsp_location ( decl_ref. range . clone ( ) ) ?;
6368 result. push ( location) ;
69+ if is_signature {
70+ get_signature_decl_member_references ( semantic_model, compilation, result, decl_ref) ;
71+ }
6472 }
6573
6674 return Some ( ( ) ) ;
@@ -119,7 +127,7 @@ pub fn search_member_references(
119127 let range = in_filed_syntax_id. value . get_range ( ) ;
120128 let location = document. to_lsp_location ( range) ?;
121129 result. push ( location) ;
122- search_member_secondary_references ( semantic_model, node, result) ;
130+ search_member_secondary_references ( semantic_model, compilation , node, result) ;
123131 }
124132 }
125133
@@ -128,6 +136,7 @@ pub fn search_member_references(
128136
129137fn search_member_secondary_references (
130138 semantic_model : & SemanticModel ,
139+ compilation : & LuaCompilation ,
131140 node : LuaSyntaxNode ,
132141 result : & mut Vec < Location > ,
133142) -> Option < ( ) > {
@@ -141,7 +150,7 @@ fn search_member_secondary_references(
141150 . position ( |value| value. get_position ( ) == position) ?;
142151 let var = vars. get ( idx) ?;
143152 let decl_id = LuaDeclId :: new ( semantic_model. get_file_id ( ) , var. get_position ( ) ) ;
144- search_decl_references ( semantic_model, decl_id, result) ;
153+ search_decl_references ( semantic_model, compilation , decl_id, result) ;
145154 let document = semantic_model. get_document ( ) ;
146155 let range = document. to_lsp_location ( var. get_range ( ) ) ?;
147156 result. push ( range) ;
@@ -152,7 +161,7 @@ fn search_member_secondary_references(
152161 let idx = values. position ( |value| value. get_position ( ) == position) ?;
153162 let name = local_names. get ( idx) ?;
154163 let decl_id = LuaDeclId :: new ( semantic_model. get_file_id ( ) , name. get_position ( ) ) ;
155- search_decl_references ( semantic_model, decl_id, result) ;
164+ search_decl_references ( semantic_model, compilation , decl_id, result) ;
156165 let document = semantic_model. get_document ( ) ;
157166 let range = document. to_lsp_location ( name. get_range ( ) ) ?;
158167 result. push ( range) ;
@@ -241,3 +250,34 @@ fn search_type_decl_references(
241250
242251 Some ( ( ) )
243252}
253+
254+ fn get_signature_decl_member_references (
255+ semantic_model : & SemanticModel ,
256+ compilation : & LuaCompilation ,
257+ result : & mut Vec < Location > ,
258+ decl_ref : & DeclReference ,
259+ ) -> Option < Vec < Location > > {
260+ let root = semantic_model. get_root ( ) ;
261+ let position = decl_ref. range . start ( ) ;
262+ let token = root. syntax ( ) . token_at_offset ( position) . right_biased ( ) ?;
263+ let parent = token. parent ( ) ?;
264+
265+ match parent. parent ( ) ? {
266+ assign_stat_node if LuaAssignStat :: can_cast ( assign_stat_node. kind ( ) . into ( ) ) => {
267+ let assign_stat = LuaAssignStat :: cast ( assign_stat_node) ?;
268+ let ( vars, values) = assign_stat. get_var_and_expr_list ( ) ;
269+ let idx = values
270+ . iter ( )
271+ . position ( |value| value. get_position ( ) == position) ?;
272+ let var = vars. get ( idx) ?;
273+ let decl_id = semantic_model
274+ . find_decl ( var. syntax ( ) . clone ( ) . into ( ) , SemanticDeclLevel :: default ( ) ) ?;
275+ if let LuaSemanticDeclId :: Member ( member_id) = decl_id {
276+ search_member_references ( semantic_model, compilation, member_id, result) ;
277+ }
278+ }
279+
280+ _ => { }
281+ }
282+ None
283+ }
0 commit comments