@@ -3,7 +3,7 @@ use std::collections::HashMap;
33use code_analysis:: {
44 LuaCompilation , LuaDeclId , LuaMemberId , LuaMemberKey , LuaPropertyOwnerId , SemanticModel ,
55} ;
6- use emmylua_parser:: { LuaAstNode , LuaAstToken , LuaStringToken , LuaSyntaxToken } ;
6+ use emmylua_parser:: { LuaAstNode , LuaAstToken , LuaNameToken , LuaStringToken , LuaSyntaxToken } ;
77use lsp_types:: Location ;
88
99pub fn search_references (
@@ -12,8 +12,7 @@ pub fn search_references(
1212 token : LuaSyntaxToken ,
1313) -> Option < Vec < Location > > {
1414 let mut result = Vec :: new ( ) ;
15- let semantic_info = semantic_model. get_semantic_info ( token. clone ( ) . into ( ) ) ;
16- if let Some ( property_owner) = semantic_info?. property_owner {
15+ if let Some ( property_owner) = semantic_model. get_property_owner_id ( token. clone ( ) . into ( ) ) {
1716 match property_owner {
1817 LuaPropertyOwnerId :: LuaDecl ( decl_id) => {
1918 search_decl_references ( semantic_model, decl_id, & mut result) ;
@@ -23,10 +22,10 @@ pub fn search_references(
2322 }
2423 _ => { }
2524 }
26- } else if let Some ( token) = LuaStringToken :: cast ( token) {
25+ } else if let Some ( token) = LuaStringToken :: cast ( token. clone ( ) ) {
2726 search_string_references ( semantic_model, token, & mut result) ;
2827 } else if semantic_model. get_emmyrc ( ) . references . fuzzy_search {
29- // todo!()
28+ fuzzy_search_references ( compilation , token , & mut result ) ;
3029 }
3130
3231 Some ( result)
@@ -130,3 +129,35 @@ fn search_string_references(
130129
131130 Some ( ( ) )
132131}
132+
133+ fn fuzzy_search_references (
134+ compilation : & LuaCompilation ,
135+ token : LuaSyntaxToken ,
136+ result : & mut Vec < Location > ,
137+ ) -> Option < ( ) > {
138+ let name = LuaNameToken :: cast ( token) ?;
139+ let name_text = name. get_name_text ( ) ;
140+ let fuzzy_references = compilation
141+ . get_db ( )
142+ . get_reference_index ( )
143+ . get_index_references ( & LuaMemberKey :: Name ( name_text. to_string ( ) . into ( ) ) ) ?;
144+
145+ let mut semantic_cache = HashMap :: new ( ) ;
146+ for in_filed_syntax_id in fuzzy_references {
147+ let semantic_model =
148+ if let Some ( semantic_model) = semantic_cache. get_mut ( & in_filed_syntax_id. file_id ) {
149+ semantic_model
150+ } else {
151+ let semantic_model = compilation. get_semantic_model ( in_filed_syntax_id. file_id ) ?;
152+ semantic_cache. insert ( in_filed_syntax_id. file_id , semantic_model) ;
153+ semantic_cache. get_mut ( & in_filed_syntax_id. file_id ) ?
154+ } ;
155+
156+ let document = semantic_model. get_document ( ) ;
157+ let range = in_filed_syntax_id. value . get_range ( ) ;
158+ let location = document. to_lsp_location ( range) ?;
159+ result. push ( location) ;
160+ }
161+
162+ Some ( ( ) )
163+ }
0 commit comments