Skip to content

Commit cc2686c

Browse files
Omit completion fields to be resolved later
1 parent 008d513 commit cc2686c

File tree

4 files changed

+99
-62
lines changed

4 files changed

+99
-62
lines changed

src/tools/rust-analyzer/crates/ide-completion/src/lib.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,8 @@ pub struct CompletionFieldsToResolve {
4343
pub resolve_tags: bool,
4444
pub resolve_detail: bool,
4545
pub resolve_documentation: bool,
46-
pub resolve_sort_text: bool,
4746
pub resolve_filter_text: bool,
4847
pub resolve_text_edit: bool,
49-
// FIXME: those are always resolved
50-
// pub resolve_additional_text_edits: bool,
5148
pub resolve_command: bool,
5249
}
5350

@@ -58,7 +55,6 @@ impl CompletionFieldsToResolve {
5855
resolve_tags: false,
5956
resolve_detail: false,
6057
resolve_documentation: false,
61-
resolve_sort_text: false,
6258
resolve_filter_text: false,
6359
resolve_text_edit: false,
6460
resolve_command: false,

src/tools/rust-analyzer/crates/rust-analyzer/src/config.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1421,7 +1421,6 @@ impl Config {
14211421
resolve_tags: client_capability_fields.contains("tags"),
14221422
resolve_detail: client_capability_fields.contains("detail"),
14231423
resolve_documentation: client_capability_fields.contains("documentation"),
1424-
resolve_sort_text: client_capability_fields.contains("sortText"),
14251424
resolve_filter_text: client_capability_fields.contains("filterText"),
14261425
resolve_text_edit: client_capability_fields.contains("textEdit"),
14271426
resolve_command: client_capability_fields.contains("command"),

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

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,33 +1056,36 @@ pub(crate) fn handle_completion_resolve(
10561056
};
10571057
let source_root = snap.analysis.source_root_id(file_id)?;
10581058

1059-
let additional_edits = snap
1060-
.analysis
1061-
.resolve_completion_edits(
1062-
&snap.config.completion(Some(source_root)),
1063-
FilePosition { file_id, offset },
1064-
resolve_data
1065-
.imports
1066-
.into_iter()
1067-
.map(|import| (import.full_import_path, import.imported_name)),
1068-
)?
1069-
.into_iter()
1070-
.flat_map(|edit| edit.into_iter().map(|indel| to_proto::text_edit(&line_index, indel)))
1071-
.collect::<Vec<_>>();
1072-
1073-
if !all_edits_are_disjoint(&original_completion, &additional_edits) {
1074-
return Err(LspError::new(
1075-
ErrorCode::InternalError as i32,
1076-
"Import edit overlaps with the original completion edits, this is not LSP-compliant"
1077-
.into(),
1078-
)
1079-
.into());
1080-
}
1059+
if !resolve_data.imports.is_empty() {
1060+
let additional_edits = snap
1061+
.analysis
1062+
.resolve_completion_edits(
1063+
&snap.config.completion(Some(source_root)),
1064+
FilePosition { file_id, offset },
1065+
resolve_data
1066+
.imports
1067+
.into_iter()
1068+
.map(|import| (import.full_import_path, import.imported_name)),
1069+
)?
1070+
.into_iter()
1071+
.flat_map(|edit| edit.into_iter().map(|indel| to_proto::text_edit(&line_index, indel)))
1072+
.collect::<Vec<_>>();
1073+
1074+
if !all_edits_are_disjoint(&original_completion, &additional_edits) {
1075+
return Err(LspError::new(
1076+
ErrorCode::InternalError as i32,
1077+
"Import edit overlaps with the original completion edits, this is not LSP-compliant"
1078+
.into(),
1079+
)
1080+
.into());
1081+
}
10811082

1082-
if let Some(original_additional_edits) = original_completion.additional_text_edits.as_mut() {
1083-
original_additional_edits.extend(additional_edits)
1084-
} else {
1085-
original_completion.additional_text_edits = Some(additional_edits);
1083+
if let Some(original_additional_edits) = original_completion.additional_text_edits.as_mut()
1084+
{
1085+
original_additional_edits.extend(additional_edits)
1086+
} else {
1087+
original_completion.additional_text_edits = Some(additional_edits);
1088+
}
10861089
}
10871090

10881091
Ok(original_completion)

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

Lines changed: 70 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -275,14 +275,23 @@ fn completion_item(
275275
) {
276276
let insert_replace_support = config.insert_replace_support().then_some(tdpp.position);
277277
let ref_match = item.ref_match();
278-
let lookup = item.lookup().to_owned();
279278

280279
let mut additional_text_edits = Vec::new();
281280
let mut something_to_resolve = false;
282281

282+
let filter_text = if fields_to_resolve.resolve_filter_text {
283+
something_to_resolve = !item.lookup().is_empty();
284+
None
285+
} else {
286+
Some(item.lookup().to_owned())
287+
};
288+
283289
// LSP does not allow arbitrary edits in completion, so we have to do a
284290
// non-trivial mapping here.
285-
let text_edit = {
291+
let text_edit = if fields_to_resolve.resolve_text_edit {
292+
something_to_resolve = true;
293+
None
294+
} else {
286295
let mut text_edit = None;
287296
let source_range = item.source_range;
288297
for indel in item.text_edit {
@@ -305,25 +314,49 @@ fn completion_item(
305314
additional_text_edits.push(text_edit);
306315
}
307316
}
308-
text_edit.unwrap()
317+
Some(text_edit.unwrap())
309318
};
310319

311320
let insert_text_format = item.is_snippet.then_some(lsp_types::InsertTextFormat::SNIPPET);
312-
let tags = item.deprecated.then(|| vec![lsp_types::CompletionItemTag::DEPRECATED]);
321+
let tags = if fields_to_resolve.resolve_tags {
322+
something_to_resolve = item.deprecated;
323+
None
324+
} else {
325+
item.deprecated.then(|| vec![lsp_types::CompletionItemTag::DEPRECATED])
326+
};
313327
let command = if item.trigger_call_info && config.client_commands().trigger_parameter_hints {
314-
Some(command::trigger_parameter_hints())
328+
if fields_to_resolve.resolve_command {
329+
something_to_resolve = true;
330+
Some(command::trigger_parameter_hints())
331+
} else {
332+
None
333+
}
315334
} else {
316335
None
317336
};
318337

338+
let detail = if fields_to_resolve.resolve_detail {
339+
something_to_resolve = item.detail.is_some();
340+
None
341+
} else {
342+
item.detail
343+
};
344+
345+
let documentation = if fields_to_resolve.resolve_documentation {
346+
something_to_resolve = item.documentation.is_some();
347+
None
348+
} else {
349+
item.documentation.map(documentation)
350+
};
351+
319352
let mut lsp_item = lsp_types::CompletionItem {
320353
label: item.label.to_string(),
321-
detail: item.detail,
322-
filter_text: Some(lookup),
354+
detail,
355+
filter_text,
323356
kind: Some(completion_item_kind(item.kind)),
324-
text_edit: Some(text_edit),
357+
text_edit,
325358
additional_text_edits: Some(additional_text_edits),
326-
documentation: item.documentation.map(documentation),
359+
documentation,
327360
deprecated: Some(item.deprecated),
328361
tags,
329362
command,
@@ -332,34 +365,40 @@ fn completion_item(
332365
};
333366

334367
if config.completion_label_details_support() {
335-
lsp_item.label_details = Some(lsp_types::CompletionItemLabelDetails {
336-
detail: item.label_detail.as_ref().map(ToString::to_string),
337-
description: lsp_item.detail.clone(),
338-
});
368+
if fields_to_resolve.resolve_label_details {
369+
something_to_resolve = true;
370+
} else {
371+
lsp_item.label_details = Some(lsp_types::CompletionItemLabelDetails {
372+
detail: item.label_detail.as_ref().map(ToString::to_string),
373+
description: lsp_item.detail.clone(),
374+
});
375+
}
339376
} else if let Some(label_detail) = item.label_detail {
340377
lsp_item.label.push_str(label_detail.as_str());
341378
}
342379

343380
set_score(&mut lsp_item, max_relevance, item.relevance);
344381

345-
if config.completion(None).enable_imports_on_the_fly && !item.import_to_add.is_empty() {
346-
let imports = item
347-
.import_to_add
348-
.into_iter()
349-
.map(|(import_path, import_name)| lsp_ext::CompletionImport {
350-
full_import_path: import_path,
351-
imported_name: import_name,
352-
})
353-
.collect::<Vec<_>>();
354-
if !imports.is_empty() {
355-
let data = lsp_ext::CompletionResolveData {
356-
position: tdpp.clone(),
357-
imports,
358-
version,
359-
completion_trigger_character,
360-
};
361-
lsp_item.data = Some(to_value(data).unwrap());
362-
}
382+
let imports =
383+
if config.completion(None).enable_imports_on_the_fly && !item.import_to_add.is_empty() {
384+
item.import_to_add
385+
.into_iter()
386+
.map(|(import_path, import_name)| lsp_ext::CompletionImport {
387+
full_import_path: import_path,
388+
imported_name: import_name,
389+
})
390+
.collect()
391+
} else {
392+
Vec::new()
393+
};
394+
if something_to_resolve || !imports.is_empty() {
395+
let data = lsp_ext::CompletionResolveData {
396+
position: tdpp.clone(),
397+
imports,
398+
version,
399+
completion_trigger_character,
400+
};
401+
lsp_item.data = Some(to_value(data).unwrap());
363402
}
364403

365404
if let Some((label, indel, relevance)) = ref_match {

0 commit comments

Comments
 (0)