@@ -10,9 +10,9 @@ use std::{
1010use anyhow:: Context ;
1111
1212use ide:: {
13- AnnotationConfig , AssistKind , AssistResolveStrategy , Cancellable , FilePosition , FileRange ,
14- HoverAction , HoverGotoTypeData , InlayFieldsToResolve , Query , RangeInfo , ReferenceCategory ,
15- Runnable , RunnableKind , SingleResolve , SourceChange , TextEdit ,
13+ AnnotationConfig , AssistKind , AssistResolveStrategy , Cancellable , CompletionFieldsToResolve ,
14+ FilePosition , FileRange , HoverAction , HoverGotoTypeData , InlayFieldsToResolve , Query ,
15+ RangeInfo , ReferenceCategory , Runnable , RunnableKind , SingleResolve , SourceChange , TextEdit ,
1616} ;
1717use ide_db:: SymbolKind ;
1818use itertools:: Itertools ;
@@ -1056,12 +1056,43 @@ pub(crate) fn handle_completion_resolve(
10561056 } ;
10571057 let source_root = snap. analysis . source_root_id ( file_id) ?;
10581058
1059+ let mut forced_resolve_completions_config = snap. config . completion ( Some ( source_root) ) ;
1060+ forced_resolve_completions_config. fields_to_resolve = CompletionFieldsToResolve :: empty ( ) ;
1061+
1062+ let position = FilePosition { file_id, offset } ;
1063+ let Some ( unresolved_completions) = snap. analysis . completions (
1064+ & & forced_resolve_completions_config,
1065+ position,
1066+ resolve_data. trigger_character ,
1067+ ) ?
1068+ else {
1069+ return Ok ( original_completion) ;
1070+ } ;
1071+ let resolved_completions = to_proto:: completion_items (
1072+ & snap. config ,
1073+ & forced_resolve_completions_config. fields_to_resolve ,
1074+ & line_index,
1075+ snap. file_version ( position. file_id ) ,
1076+ resolve_data. position ,
1077+ resolve_data. trigger_character ,
1078+ unresolved_completions,
1079+ ) ;
1080+ let Some ( mut resolved_completion) = resolved_completions. into_iter ( ) . find ( |completion| {
1081+ completion. label == original_completion. label
1082+ && completion. kind == original_completion. kind
1083+ && completion. deprecated == original_completion. deprecated
1084+ && completion. preselect == original_completion. preselect
1085+ && completion. sort_text == original_completion. sort_text
1086+ } ) else {
1087+ return Ok ( original_completion) ;
1088+ } ;
1089+
10591090 if !resolve_data. imports . is_empty ( ) {
10601091 let additional_edits = snap
10611092 . analysis
10621093 . resolve_completion_edits (
1063- & snap . config . completion ( Some ( source_root ) ) ,
1064- FilePosition { file_id , offset } ,
1094+ & forced_resolve_completions_config ,
1095+ position ,
10651096 resolve_data
10661097 . imports
10671098 . into_iter ( )
@@ -1071,7 +1102,7 @@ pub(crate) fn handle_completion_resolve(
10711102 . flat_map ( |edit| edit. into_iter ( ) . map ( |indel| to_proto:: text_edit ( & line_index, indel) ) )
10721103 . collect :: < Vec < _ > > ( ) ;
10731104
1074- if !all_edits_are_disjoint ( & original_completion , & additional_edits) {
1105+ if !all_edits_are_disjoint ( & resolved_completion , & additional_edits) {
10751106 return Err ( LspError :: new (
10761107 ErrorCode :: InternalError as i32 ,
10771108 "Import edit overlaps with the original completion edits, this is not LSP-compliant"
@@ -1080,15 +1111,15 @@ pub(crate) fn handle_completion_resolve(
10801111 . into ( ) ) ;
10811112 }
10821113
1083- if let Some ( original_additional_edits) = original_completion . additional_text_edits . as_mut ( )
1114+ if let Some ( original_additional_edits) = resolved_completion . additional_text_edits . as_mut ( )
10841115 {
10851116 original_additional_edits. extend ( additional_edits)
10861117 } else {
1087- original_completion . additional_text_edits = Some ( additional_edits) ;
1118+ resolved_completion . additional_text_edits = Some ( additional_edits) ;
10881119 }
10891120 }
10901121
1091- Ok ( original_completion )
1122+ Ok ( resolved_completion )
10921123}
10931124
10941125pub ( crate ) fn handle_folding_range (
0 commit comments