@@ -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
268268fn filter_suggestions < F > (
269269 cached : & SuggestionsCacheEntry ,
270+ prefix : Option < & str > ,
270271 filter : & F ,
271- range : Option < Range > ,
272+ context : & Context ,
272273) -> SuggestionsCacheEntry
273274where
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
284285fn collect_entries < F > (
285286 items : & [ CompletionItem ] ,
286287 filter : & F ,
287- range : Option < Range > ,
288+ prefix : Option < & str > ,
289+ context : & Context ,
288290) -> Vec < CompletionItem >
289291where
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