Skip to content

Commit 4cda576

Browse files
Revert "Omit completion fields to be resolved later"
This reverts commit cc2686c.
1 parent 23abd97 commit 4cda576

File tree

4 files changed

+62
-99
lines changed

4 files changed

+62
-99
lines changed

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

+4
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,11 @@ pub struct CompletionFieldsToResolve {
4343
pub resolve_tags: bool,
4444
pub resolve_detail: bool,
4545
pub resolve_documentation: bool,
46+
pub resolve_sort_text: bool,
4647
pub resolve_filter_text: bool,
4748
pub resolve_text_edit: bool,
49+
// FIXME: those are always resolved
50+
// pub resolve_additional_text_edits: bool,
4851
pub resolve_command: bool,
4952
}
5053

@@ -55,6 +58,7 @@ impl CompletionFieldsToResolve {
5558
resolve_tags: false,
5659
resolve_detail: false,
5760
resolve_documentation: false,
61+
resolve_sort_text: false,
5862
resolve_filter_text: false,
5963
resolve_text_edit: false,
6064
resolve_command: false,

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

+1
Original file line numberDiff line numberDiff line change
@@ -1423,6 +1423,7 @@ impl Config {
14231423
resolve_tags: client_capability_fields.contains("tags"),
14241424
resolve_detail: client_capability_fields.contains("detail"),
14251425
resolve_documentation: client_capability_fields.contains("documentation"),
1426+
resolve_sort_text: client_capability_fields.contains("sortText"),
14261427
resolve_filter_text: client_capability_fields.contains("filterText"),
14271428
resolve_text_edit: client_capability_fields.contains("textEdit"),
14281429
resolve_command: client_capability_fields.contains("command"),

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

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

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-
}
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<_>>();
10821072

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-
}
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+
}
1081+
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);
10891086
}
10901087

10911088
Ok(original_completion)

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

+31-70
Original file line numberDiff line numberDiff line change
@@ -275,23 +275,14 @@ 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();
278279

279280
let mut additional_text_edits = Vec::new();
280281
let mut something_to_resolve = false;
281282

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-
289283
// LSP does not allow arbitrary edits in completion, so we have to do a
290284
// non-trivial mapping here.
291-
let text_edit = if fields_to_resolve.resolve_text_edit {
292-
something_to_resolve = true;
293-
None
294-
} else {
285+
let text_edit = {
295286
let mut text_edit = None;
296287
let source_range = item.source_range;
297288
for indel in item.text_edit {
@@ -314,49 +305,25 @@ fn completion_item(
314305
additional_text_edits.push(text_edit);
315306
}
316307
}
317-
Some(text_edit.unwrap())
308+
text_edit.unwrap()
318309
};
319310

320311
let insert_text_format = item.is_snippet.then_some(lsp_types::InsertTextFormat::SNIPPET);
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-
};
312+
let tags = item.deprecated.then(|| vec![lsp_types::CompletionItemTag::DEPRECATED]);
327313
let command = if item.trigger_call_info && config.client_commands().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-
}
314+
Some(command::trigger_parameter_hints())
334315
} else {
335316
None
336317
};
337318

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-
352319
let mut lsp_item = lsp_types::CompletionItem {
353320
label: item.label.to_string(),
354-
detail,
355-
filter_text,
321+
detail: item.detail,
322+
filter_text: Some(lookup),
356323
kind: Some(completion_item_kind(item.kind)),
357-
text_edit,
324+
text_edit: Some(text_edit),
358325
additional_text_edits: Some(additional_text_edits),
359-
documentation,
326+
documentation: item.documentation.map(documentation),
360327
deprecated: Some(item.deprecated),
361328
tags,
362329
command,
@@ -365,40 +332,34 @@ fn completion_item(
365332
};
366333

367334
if config.completion_label_details_support() {
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-
}
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+
});
376339
} else if let Some(label_detail) = item.label_detail {
377340
lsp_item.label.push_str(label_detail.as_str());
378341
}
379342

380343
set_score(&mut lsp_item, max_relevance, item.relevance);
381344

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());
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+
}
402363
}
403364

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

0 commit comments

Comments
 (0)