mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-27 05:23:24 +00:00
Merge #7183
7183: YAGNI active_resolve_capabilities r=matklad a=matklad
bors r+
🤖
Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
commit
7ae4b8bdb6
7 changed files with 32 additions and 78 deletions
|
@ -46,7 +46,7 @@ pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionC
|
||||||
acc.add_resolution(ctx, name.to_string(), &res)
|
acc.add_resolution(ctx, name.to_string(), &res)
|
||||||
});
|
});
|
||||||
|
|
||||||
if ctx.config.enable_autoimport_completions && ctx.config.resolve_additional_edits_lazily() {
|
if ctx.config.enable_autoimport_completions {
|
||||||
fuzzy_completion(acc, ctx);
|
fuzzy_completion(acc, ctx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -206,11 +206,7 @@ mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fuzzy_completion_config() -> CompletionConfig {
|
fn fuzzy_completion_config() -> CompletionConfig {
|
||||||
let mut completion_config = CompletionConfig::default();
|
CompletionConfig::default()
|
||||||
completion_config
|
|
||||||
.active_resolve_capabilities
|
|
||||||
.insert(crate::CompletionResolveCapability::AdditionalTextEdits);
|
|
||||||
completion_config
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
//! completions if we are allowed to.
|
//! completions if we are allowed to.
|
||||||
|
|
||||||
use ide_db::helpers::insert_use::MergeBehavior;
|
use ide_db::helpers::insert_use::MergeBehavior;
|
||||||
use rustc_hash::FxHashSet;
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||||
pub struct CompletionConfig {
|
pub struct CompletionConfig {
|
||||||
|
@ -15,32 +14,12 @@ pub struct CompletionConfig {
|
||||||
pub add_call_argument_snippets: bool,
|
pub add_call_argument_snippets: bool,
|
||||||
pub snippet_cap: Option<SnippetCap>,
|
pub snippet_cap: Option<SnippetCap>,
|
||||||
pub merge: Option<MergeBehavior>,
|
pub merge: Option<MergeBehavior>,
|
||||||
/// A set of capabilities, enabled on the client and supported on the server.
|
|
||||||
pub active_resolve_capabilities: FxHashSet<CompletionResolveCapability>,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A resolve capability, supported on the server.
|
|
||||||
/// If the client registers any completion resolve capabilities,
|
|
||||||
/// the server is able to render completion items' corresponding fields later,
|
|
||||||
/// not during an initial completion item request.
|
|
||||||
/// See https://github.com/rust-analyzer/rust-analyzer/issues/6366 for more details.
|
|
||||||
#[derive(Debug, Copy, Clone, Hash, Eq, PartialEq)]
|
|
||||||
pub enum CompletionResolveCapability {
|
|
||||||
Documentation,
|
|
||||||
Detail,
|
|
||||||
AdditionalTextEdits,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CompletionConfig {
|
impl CompletionConfig {
|
||||||
pub fn allow_snippets(&mut self, yes: bool) {
|
pub fn allow_snippets(&mut self, yes: bool) {
|
||||||
self.snippet_cap = if yes { Some(SnippetCap { _private: () }) } else { None }
|
self.snippet_cap = if yes { Some(SnippetCap { _private: () }) } else { None }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Whether the completions' additional edits are calculated when sending an initional completions list
|
|
||||||
/// or later, in a separate resolve request.
|
|
||||||
pub fn resolve_additional_edits_lazily(&self) -> bool {
|
|
||||||
self.active_resolve_capabilities.contains(&CompletionResolveCapability::AdditionalTextEdits)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||||
|
@ -57,7 +36,6 @@ impl Default for CompletionConfig {
|
||||||
add_call_argument_snippets: true,
|
add_call_argument_snippets: true,
|
||||||
snippet_cap: Some(SnippetCap { _private: () }),
|
snippet_cap: Some(SnippetCap { _private: () }),
|
||||||
merge: Some(MergeBehavior::Full),
|
merge: Some(MergeBehavior::Full),
|
||||||
active_resolve_capabilities: FxHashSet::default(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ use text_edit::TextEdit;
|
||||||
use crate::{completions::Completions, context::CompletionContext, item::CompletionKind};
|
use crate::{completions::Completions, context::CompletionContext, item::CompletionKind};
|
||||||
|
|
||||||
pub use crate::{
|
pub use crate::{
|
||||||
config::{CompletionConfig, CompletionResolveCapability},
|
config::CompletionConfig,
|
||||||
item::{CompletionItem, CompletionItemKind, CompletionScore, ImportEdit, InsertTextFormat},
|
item::{CompletionItem, CompletionItemKind, CompletionScore, ImportEdit, InsertTextFormat},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -82,8 +82,8 @@ pub use crate::{
|
||||||
};
|
};
|
||||||
pub use assists::{Assist, AssistConfig, AssistId, AssistKind};
|
pub use assists::{Assist, AssistConfig, AssistId, AssistKind};
|
||||||
pub use completion::{
|
pub use completion::{
|
||||||
CompletionConfig, CompletionItem, CompletionItemKind, CompletionResolveCapability,
|
CompletionConfig, CompletionItem, CompletionItemKind, CompletionScore, ImportEdit,
|
||||||
CompletionScore, ImportEdit, InsertTextFormat,
|
InsertTextFormat,
|
||||||
};
|
};
|
||||||
pub use hir::{Documentation, Semantics};
|
pub use hir::{Documentation, Semantics};
|
||||||
pub use ide_db::base_db::{
|
pub use ide_db::base_db::{
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
//! Advertizes the capabilities of the LSP Server.
|
//! Advertizes the capabilities of the LSP Server.
|
||||||
use std::env;
|
use std::env;
|
||||||
|
|
||||||
use ide::CompletionResolveCapability;
|
|
||||||
use lsp_types::{
|
use lsp_types::{
|
||||||
CallHierarchyServerCapability, ClientCapabilities, CodeActionKind, CodeActionOptions,
|
CallHierarchyServerCapability, ClientCapabilities, CodeActionKind, CodeActionOptions,
|
||||||
CodeActionProviderCapability, CodeLensOptions, CompletionOptions,
|
CodeActionProviderCapability, CodeLensOptions, CompletionOptions,
|
||||||
|
@ -14,7 +13,6 @@ use lsp_types::{
|
||||||
WorkDoneProgressOptions, WorkspaceFileOperationsServerCapabilities,
|
WorkDoneProgressOptions, WorkspaceFileOperationsServerCapabilities,
|
||||||
WorkspaceServerCapabilities,
|
WorkspaceServerCapabilities,
|
||||||
};
|
};
|
||||||
use rustc_hash::FxHashSet;
|
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
|
|
||||||
use crate::semantic_tokens;
|
use crate::semantic_tokens;
|
||||||
|
@ -118,37 +116,31 @@ pub fn server_capabilities(client_caps: &ClientCapabilities) -> ServerCapabiliti
|
||||||
}
|
}
|
||||||
|
|
||||||
fn completions_resolve_provider(client_caps: &ClientCapabilities) -> Option<bool> {
|
fn completions_resolve_provider(client_caps: &ClientCapabilities) -> Option<bool> {
|
||||||
if enabled_completions_resolve_capabilities(client_caps)?.is_empty() {
|
if completion_item_edit_resolve(client_caps) {
|
||||||
|
Some(true)
|
||||||
|
} else {
|
||||||
log::info!("No `additionalTextEdits` completion resolve capability was found in the client capabilities, autoimport completion is disabled");
|
log::info!("No `additionalTextEdits` completion resolve capability was found in the client capabilities, autoimport completion is disabled");
|
||||||
None
|
None
|
||||||
} else {
|
|
||||||
Some(true)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses client capabilities and returns all completion resolve capabilities rust-analyzer supports.
|
/// Parses client capabilities and returns all completion resolve capabilities rust-analyzer supports.
|
||||||
pub(crate) fn enabled_completions_resolve_capabilities(
|
pub(crate) fn completion_item_edit_resolve(caps: &ClientCapabilities) -> bool {
|
||||||
caps: &ClientCapabilities,
|
(|| {
|
||||||
) -> Option<FxHashSet<CompletionResolveCapability>> {
|
Some(
|
||||||
Some(
|
caps.text_document
|
||||||
caps.text_document
|
.as_ref()?
|
||||||
.as_ref()?
|
.completion
|
||||||
.completion
|
.as_ref()?
|
||||||
.as_ref()?
|
.completion_item
|
||||||
.completion_item
|
.as_ref()?
|
||||||
.as_ref()?
|
.resolve_support
|
||||||
.resolve_support
|
.as_ref()?
|
||||||
.as_ref()?
|
.properties
|
||||||
.properties
|
.iter()
|
||||||
.iter()
|
.any(|cap_string| cap_string.as_str() == "additionalTextEdits"),
|
||||||
.filter_map(|cap_string| match cap_string.as_str() {
|
)
|
||||||
"additionalTextEdits" => Some(CompletionResolveCapability::AdditionalTextEdits),
|
})() == Some(true)
|
||||||
"detail" => Some(CompletionResolveCapability::Detail),
|
|
||||||
"documentation" => Some(CompletionResolveCapability::Documentation),
|
|
||||||
_unsupported => None,
|
|
||||||
})
|
|
||||||
.collect(),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn code_action_capabilities(client_caps: &ClientCapabilities) -> CodeActionProviderCapability {
|
fn code_action_capabilities(client_caps: &ClientCapabilities) -> CodeActionProviderCapability {
|
||||||
|
|
|
@ -20,7 +20,7 @@ use rustc_hash::FxHashSet;
|
||||||
use serde::{de::DeserializeOwned, Deserialize};
|
use serde::{de::DeserializeOwned, Deserialize};
|
||||||
use vfs::AbsPathBuf;
|
use vfs::AbsPathBuf;
|
||||||
|
|
||||||
use crate::{caps::enabled_completions_resolve_capabilities, diagnostics::DiagnosticsMapConfig};
|
use crate::{caps::completion_item_edit_resolve, diagnostics::DiagnosticsMapConfig};
|
||||||
|
|
||||||
config_data! {
|
config_data! {
|
||||||
struct ConfigData {
|
struct ConfigData {
|
||||||
|
@ -536,12 +536,11 @@ impl Config {
|
||||||
pub fn completion(&self) -> CompletionConfig {
|
pub fn completion(&self) -> CompletionConfig {
|
||||||
let mut res = CompletionConfig::default();
|
let mut res = CompletionConfig::default();
|
||||||
res.enable_postfix_completions = self.data.completion_postfix_enable;
|
res.enable_postfix_completions = self.data.completion_postfix_enable;
|
||||||
res.enable_autoimport_completions = self.data.completion_autoimport_enable;
|
res.enable_autoimport_completions =
|
||||||
|
self.data.completion_autoimport_enable && completion_item_edit_resolve(&self.caps);
|
||||||
res.add_call_parenthesis = self.data.completion_addCallParenthesis;
|
res.add_call_parenthesis = self.data.completion_addCallParenthesis;
|
||||||
res.add_call_argument_snippets = self.data.completion_addCallArgumentSnippets;
|
res.add_call_argument_snippets = self.data.completion_addCallArgumentSnippets;
|
||||||
res.merge = self.merge_behavior();
|
res.merge = self.merge_behavior();
|
||||||
res.active_resolve_capabilities =
|
|
||||||
enabled_completions_resolve_capabilities(&self.caps).unwrap_or_default();
|
|
||||||
|
|
||||||
res.allow_snippets(try_or!(
|
res.allow_snippets(try_or!(
|
||||||
self.caps
|
self.caps
|
||||||
|
|
|
@ -9,9 +9,8 @@ use std::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use ide::{
|
use ide::{
|
||||||
CompletionResolveCapability, FileId, FilePosition, FileRange, HoverAction, HoverGotoTypeData,
|
FileId, FilePosition, FileRange, HoverAction, HoverGotoTypeData, LineIndex, NavigationTarget,
|
||||||
LineIndex, NavigationTarget, Query, RangeInfo, Runnable, RunnableKind, SearchScope,
|
Query, RangeInfo, Runnable, RunnableKind, SearchScope, SourceChange, SymbolKind, TextEdit,
|
||||||
SourceChange, SymbolKind, TextEdit,
|
|
||||||
};
|
};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use lsp_server::ErrorCode;
|
use lsp_server::ErrorCode;
|
||||||
|
@ -634,10 +633,9 @@ pub(crate) fn handle_completion(
|
||||||
let mut new_completion_items =
|
let mut new_completion_items =
|
||||||
to_proto::completion_item(&line_index, line_endings, item.clone());
|
to_proto::completion_item(&line_index, line_endings, item.clone());
|
||||||
|
|
||||||
if completion_config.resolve_additional_edits_lazily() {
|
if completion_config.enable_autoimport_completions {
|
||||||
for new_item in &mut new_completion_items {
|
for new_item in &mut new_completion_items {
|
||||||
let _ = fill_resolve_data(&mut new_item.data, &item, &text_document_position)
|
fill_resolve_data(&mut new_item.data, &item, &text_document_position);
|
||||||
.take();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -663,15 +661,6 @@ pub(crate) fn handle_completion_resolve(
|
||||||
.into());
|
.into());
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME resolve the other capabilities also?
|
|
||||||
let completion_config = &snap.config.completion();
|
|
||||||
if !completion_config
|
|
||||||
.active_resolve_capabilities
|
|
||||||
.contains(&CompletionResolveCapability::AdditionalTextEdits)
|
|
||||||
{
|
|
||||||
return Ok(original_completion);
|
|
||||||
}
|
|
||||||
|
|
||||||
let resolve_data = match original_completion
|
let resolve_data = match original_completion
|
||||||
.data
|
.data
|
||||||
.take()
|
.take()
|
||||||
|
@ -690,7 +679,7 @@ pub(crate) fn handle_completion_resolve(
|
||||||
let additional_edits = snap
|
let additional_edits = snap
|
||||||
.analysis
|
.analysis
|
||||||
.resolve_completion_edits(
|
.resolve_completion_edits(
|
||||||
&completion_config,
|
&snap.config.completion(),
|
||||||
FilePosition { file_id, offset },
|
FilePosition { file_id, offset },
|
||||||
&resolve_data.full_import_path,
|
&resolve_data.full_import_path,
|
||||||
resolve_data.imported_name,
|
resolve_data.imported_name,
|
||||||
|
|
Loading…
Reference in a new issue