Skip to content

Commit cde210f

Browse files
committed
support fuzzy references query
1 parent 881b659 commit cde210f

File tree

1 file changed

+36
-5
lines changed

1 file changed

+36
-5
lines changed

crates/emmylua_ls/src/handlers/references/reference_seacher.rs

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::collections::HashMap;
33
use 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};
77
use lsp_types::Location;
88

99
pub 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

Comments
 (0)