@@ -10,9 +10,9 @@ use std::{
10
10
use anyhow:: Context ;
11
11
12
12
use 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 ,
16
16
} ;
17
17
use ide_db:: SymbolKind ;
18
18
use itertools:: Itertools ;
@@ -1056,12 +1056,43 @@ pub(crate) fn handle_completion_resolve(
1056
1056
} ;
1057
1057
let source_root = snap. analysis . source_root_id ( file_id) ?;
1058
1058
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
+
1059
1090
if !resolve_data. imports . is_empty ( ) {
1060
1091
let additional_edits = snap
1061
1092
. analysis
1062
1093
. resolve_completion_edits (
1063
- & snap . config . completion ( Some ( source_root ) ) ,
1064
- FilePosition { file_id , offset } ,
1094
+ & forced_resolve_completions_config ,
1095
+ position ,
1065
1096
resolve_data
1066
1097
. imports
1067
1098
. into_iter ( )
@@ -1071,7 +1102,7 @@ pub(crate) fn handle_completion_resolve(
1071
1102
. flat_map ( |edit| edit. into_iter ( ) . map ( |indel| to_proto:: text_edit ( & line_index, indel) ) )
1072
1103
. collect :: < Vec < _ > > ( ) ;
1073
1104
1074
- if !all_edits_are_disjoint ( & original_completion , & additional_edits) {
1105
+ if !all_edits_are_disjoint ( & resolved_completion , & additional_edits) {
1075
1106
return Err ( LspError :: new (
1076
1107
ErrorCode :: InternalError as i32 ,
1077
1108
"Import edit overlaps with the original completion edits, this is not LSP-compliant"
@@ -1080,15 +1111,15 @@ pub(crate) fn handle_completion_resolve(
1080
1111
. into ( ) ) ;
1081
1112
}
1082
1113
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 ( )
1084
1115
{
1085
1116
original_additional_edits. extend ( additional_edits)
1086
1117
} else {
1087
- original_completion . additional_text_edits = Some ( additional_edits) ;
1118
+ resolved_completion . additional_text_edits = Some ( additional_edits) ;
1088
1119
}
1089
1120
}
1090
1121
1091
- Ok ( original_completion )
1122
+ Ok ( resolved_completion )
1092
1123
}
1093
1124
1094
1125
pub ( crate ) fn handle_folding_range (
0 commit comments