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);
}
}
}
fn fuzzy_completion_config() -> CompletionConfig {
- let mut completion_config = CompletionConfig::default();
- completion_config
- .active_resolve_capabilities
- .insert(crate::CompletionResolveCapability::AdditionalTextEdits);
- completion_config
+ CompletionConfig::default()
}
#[test]
//! completions if we are allowed to.
use ide_db::helpers::insert_use::MergeBehavior;
-use rustc_hash::FxHashSet;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct CompletionConfig {
pub add_call_argument_snippets: bool,
pub snippet_cap: Option<SnippetCap>,
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 {
pub fn allow_snippets(&mut self, yes: bool) {
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)]
add_call_argument_snippets: true,
snippet_cap: Some(SnippetCap { _private: () }),
merge: Some(MergeBehavior::Full),
- active_resolve_capabilities: FxHashSet::default(),
}
}
}
use crate::{completions::Completions, context::CompletionContext, item::CompletionKind};
pub use crate::{
- config::{CompletionConfig, CompletionResolveCapability},
+ config::CompletionConfig,
item::{CompletionItem, CompletionItemKind, CompletionScore, ImportEdit, InsertTextFormat},
};
};
pub use assists::{Assist, AssistConfig, AssistId, AssistKind};
pub use completion::{
- CompletionConfig, CompletionItem, CompletionItemKind, CompletionResolveCapability,
- CompletionScore, ImportEdit, InsertTextFormat,
+ CompletionConfig, CompletionItem, CompletionItemKind, CompletionScore, ImportEdit,
+ InsertTextFormat,
};
pub use hir::{Documentation, Semantics};
pub use ide_db::base_db::{
//! Advertizes the capabilities of the LSP Server.
use std::env;
-use ide::CompletionResolveCapability;
use lsp_types::{
CallHierarchyServerCapability, ClientCapabilities, CodeActionKind, CodeActionOptions,
CodeActionProviderCapability, CodeLensOptions, CompletionOptions,
WorkDoneProgressOptions, WorkspaceFileOperationsServerCapabilities,
WorkspaceServerCapabilities,
};
-use rustc_hash::FxHashSet;
use serde_json::json;
use crate::semantic_tokens;
}
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");
None
- } else {
- Some(true)
}
}
/// Parses client capabilities and returns all completion resolve capabilities rust-analyzer supports.
-pub(crate) fn enabled_completions_resolve_capabilities(
- caps: &ClientCapabilities,
-) -> Option<FxHashSet<CompletionResolveCapability>> {
- Some(
- caps.text_document
- .as_ref()?
- .completion
- .as_ref()?
- .completion_item
- .as_ref()?
- .resolve_support
- .as_ref()?
- .properties
- .iter()
- .filter_map(|cap_string| match cap_string.as_str() {
- "additionalTextEdits" => Some(CompletionResolveCapability::AdditionalTextEdits),
- "detail" => Some(CompletionResolveCapability::Detail),
- "documentation" => Some(CompletionResolveCapability::Documentation),
- _unsupported => None,
- })
- .collect(),
- )
+pub(crate) fn completion_item_edit_resolve(caps: &ClientCapabilities) -> bool {
+ (|| {
+ Some(
+ caps.text_document
+ .as_ref()?
+ .completion
+ .as_ref()?
+ .completion_item
+ .as_ref()?
+ .resolve_support
+ .as_ref()?
+ .properties
+ .iter()
+ .any(|cap_string| cap_string.as_str() == "additionalTextEdits"),
+ )
+ })() == Some(true)
}
fn code_action_capabilities(client_caps: &ClientCapabilities) -> CodeActionProviderCapability {
use serde::{de::DeserializeOwned, Deserialize};
use vfs::AbsPathBuf;
-use crate::{caps::enabled_completions_resolve_capabilities, diagnostics::DiagnosticsMapConfig};
+use crate::{caps::completion_item_edit_resolve, diagnostics::DiagnosticsMapConfig};
config_data! {
struct ConfigData {
pub fn completion(&self) -> CompletionConfig {
let mut res = CompletionConfig::default();
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_argument_snippets = self.data.completion_addCallArgumentSnippets;
res.merge = self.merge_behavior();
- res.active_resolve_capabilities =
- enabled_completions_resolve_capabilities(&self.caps).unwrap_or_default();
res.allow_snippets(try_or!(
self.caps
};
use ide::{
- CompletionResolveCapability, FileId, FilePosition, FileRange, HoverAction, HoverGotoTypeData,
- LineIndex, NavigationTarget, Query, RangeInfo, Runnable, RunnableKind, SearchScope,
- SourceChange, SymbolKind, TextEdit,
+ FileId, FilePosition, FileRange, HoverAction, HoverGotoTypeData, LineIndex, NavigationTarget,
+ Query, RangeInfo, Runnable, RunnableKind, SearchScope, SourceChange, SymbolKind, TextEdit,
};
use itertools::Itertools;
use lsp_server::ErrorCode;
let mut new_completion_items =
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 {
- let _ = fill_resolve_data(&mut new_item.data, &item, &text_document_position)
- .take();
+ fill_resolve_data(&mut new_item.data, &item, &text_document_position);
}
}
.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
.data
.take()
let additional_edits = snap
.analysis
.resolve_completion_edits(
- &completion_config,
+ &snap.config.completion(),
FilePosition { file_id, offset },
&resolve_data.full_import_path,
resolve_data.imported_name,