Skip to content

Commit ecae5a8

Browse files
Resolve completion items
1 parent cc2686c commit ecae5a8

File tree

3 files changed

+42
-11
lines changed

3 files changed

+42
-11
lines changed

src/tools/rust-analyzer/crates/rust-analyzer/src/handlers/request.rs

+40-9
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ use std::{
1010
use anyhow::Context;
1111

1212
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,
1616
};
1717
use ide_db::SymbolKind;
1818
use 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

10941125
pub(crate) fn handle_folding_range(

src/tools/rust-analyzer/crates/rust-analyzer/src/lsp/ext.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -825,7 +825,7 @@ pub struct CompletionResolveData {
825825
pub position: lsp_types::TextDocumentPositionParams,
826826
pub imports: Vec<CompletionImport>,
827827
pub version: Option<i32>,
828-
pub completion_trigger_character: Option<char>,
828+
pub trigger_character: Option<char>,
829829
}
830830

831831
#[derive(Debug, Serialize, Deserialize)]

src/tools/rust-analyzer/crates/rust-analyzer/src/lsp/to_proto.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ fn completion_item(
396396
position: tdpp.clone(),
397397
imports,
398398
version,
399-
completion_trigger_character,
399+
trigger_character: completion_trigger_character,
400400
};
401401
lsp_item.data = Some(to_value(data).unwrap());
402402
}

0 commit comments

Comments
 (0)