Skip to content

Commit d63fda0

Browse files
committed
Filter cached items that were already imported
1 parent 052bb6b commit d63fda0

File tree

1 file changed

+35
-16
lines changed

1 file changed

+35
-16
lines changed

compiler-lsp/analyzer/src/completion.rs

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -223,13 +223,13 @@ fn get_or_populate_suggestions<F: Filter>(
223223

224224
if let Some(cached) = cache.get(&query) {
225225
tracing::debug!("Found exact match for '{query}'");
226-
let filtered = filter_suggestions(cached, &filter, context.range);
226+
let filtered = filter_suggestions(cached, prefix, &filter, context);
227227
return Ok(Arc::new(filtered));
228228
}
229229

230230
if let Some(cached) = cache.get_ancestor_value(&query) {
231231
tracing::debug!("Found prefix match for '{query}'");
232-
let filtered = filter_suggestions(cached, &filter, context.range);
232+
let filtered = filter_suggestions(cached, prefix, &filter, context);
233233

234234
let key = query.to_string();
235235
let value = Arc::new(filtered);
@@ -267,37 +267,56 @@ fn get_or_populate_suggestions<F: Filter>(
267267

268268
fn filter_suggestions<F>(
269269
cached: &SuggestionsCacheEntry,
270+
prefix: Option<&str>,
270271
filter: &F,
271-
range: Option<Range>,
272+
context: &Context,
272273
) -> SuggestionsCacheEntry
273274
where
274275
F: Filter,
275276
{
276277
SuggestionsCacheEntry {
277-
terms: collect_entries(&cached.terms, filter, range),
278-
types: collect_entries(&cached.types, filter, range),
279-
qualified_terms: collect_entries(&cached.qualified_terms, filter, range),
280-
qualified_types: collect_entries(&cached.qualified_types, filter, range),
278+
terms: collect_entries(&cached.terms, filter, prefix, context),
279+
types: collect_entries(&cached.types, filter, prefix, context),
280+
qualified_terms: collect_entries(&cached.qualified_terms, filter, prefix, context),
281+
qualified_types: collect_entries(&cached.qualified_types, filter, prefix, context),
281282
}
282283
}
283284

284285
fn collect_entries<F>(
285286
items: &[CompletionItem],
286287
filter: &F,
287-
range: Option<Range>,
288+
prefix: Option<&str>,
289+
context: &Context,
288290
) -> Vec<CompletionItem>
289291
where
290292
F: Filter,
291293
{
292-
let entries =
293-
items.iter().filter(|item| filter.matches(&item.label)).cloned().map(|mut item| {
294-
let Some(range) = range else {
295-
return item;
294+
let entries = items.iter().filter(|item| {
295+
if !filter.matches(&item.label) {
296+
return false;
297+
}
298+
if item.additional_text_edits.is_some() {
299+
let has_import = match item.kind {
300+
Some(CompletionItemKind::VALUE) => context.has_term_import(prefix, &item.label),
301+
Some(CompletionItemKind::STRUCT) => context.has_type_import(prefix, &item.label),
302+
_ => false,
296303
};
297-
if let Some(CompletionTextEdit::Edit(text_edit)) = &mut item.text_edit {
298-
text_edit.range = range;
304+
if has_import {
305+
return false;
299306
}
300-
item
301-
});
307+
}
308+
true
309+
});
310+
311+
let entries = entries.cloned().map(|mut item| {
312+
let Some(range) = context.range else {
313+
return item;
314+
};
315+
if let Some(CompletionTextEdit::Edit(text_edit)) = &mut item.text_edit {
316+
text_edit.range = range;
317+
}
318+
item
319+
});
320+
302321
entries.collect()
303322
}

0 commit comments

Comments
 (0)