diff --git a/src/tools/rust-analyzer/crates/ide-diagnostics/src/lib.rs b/src/tools/rust-analyzer/crates/ide-diagnostics/src/lib.rs index 85918254dc58e..a419f04bfae64 100644 --- a/src/tools/rust-analyzer/crates/ide-diagnostics/src/lib.rs +++ b/src/tools/rust-analyzer/crates/ide-diagnostics/src/lib.rs @@ -86,7 +86,7 @@ use ide_db::{ label::Label, source_change::SourceChange, syntax_helpers::node_ext::parse_tt_as_comma_sep_paths, - FxHashMap, FxHashSet, RootDatabase, + FxHashMap, FxHashSet, RootDatabase, SnippetCap, }; use once_cell::sync::Lazy; use stdx::never; @@ -229,6 +229,7 @@ pub struct DiagnosticsConfig { pub expr_fill_default: ExprFillDefaultMode, pub style_lints: bool, // FIXME: We may want to include a whole `AssistConfig` here + pub snippet_cap: Option, pub insert_use: InsertUseConfig, pub prefer_no_std: bool, pub prefer_prelude: bool, @@ -248,6 +249,7 @@ impl DiagnosticsConfig { disabled: Default::default(), expr_fill_default: Default::default(), style_lints: true, + snippet_cap: SnippetCap::new(true), insert_use: InsertUseConfig { granularity: ImportGranularity::Preserve, enforce_granularity: false, diff --git a/src/tools/rust-analyzer/crates/rust-analyzer/src/caps.rs b/src/tools/rust-analyzer/crates/rust-analyzer/src/caps.rs index a1469c22abf01..a207be3cac31a 100644 --- a/src/tools/rust-analyzer/crates/rust-analyzer/src/caps.rs +++ b/src/tools/rust-analyzer/crates/rust-analyzer/src/caps.rs @@ -223,7 +223,7 @@ fn code_action_capabilities(client_caps: &ClientCapabilities) -> CodeActionProvi fn more_trigger_character(config: &Config) -> Vec { let mut res = vec![".".to_owned(), ">".to_owned(), "{".to_owned(), "(".to_owned()]; - if config.snippet_cap() { + if config.snippet_cap().is_some() { res.push("<".to_owned()); } res diff --git a/src/tools/rust-analyzer/crates/rust-analyzer/src/cli/analysis_stats.rs b/src/tools/rust-analyzer/crates/rust-analyzer/src/cli/analysis_stats.rs index 932f2e70b3c9a..90b81d0a80d3b 100644 --- a/src/tools/rust-analyzer/crates/rust-analyzer/src/cli/analysis_stats.rs +++ b/src/tools/rust-analyzer/crates/rust-analyzer/src/cli/analysis_stats.rs @@ -25,7 +25,7 @@ use ide_db::{ salsa::{self, debug::DebugQueryTable, ParallelDatabase}, SourceDatabase, SourceDatabaseExt, }, - LineIndexDatabase, + LineIndexDatabase, SnippetCap, }; use itertools::Itertools; use load_cargo::{load_workspace, LoadCargoConfig, ProcMacroServerChoice}; @@ -982,6 +982,7 @@ impl flags::AnalysisStats { disable_experimental: false, disabled: Default::default(), expr_fill_default: Default::default(), + snippet_cap: SnippetCap::new(true), insert_use: ide_db::imports::insert_use::InsertUseConfig { granularity: ide_db::imports::insert_use::ImportGranularity::Crate, enforce_granularity: true, diff --git a/src/tools/rust-analyzer/crates/rust-analyzer/src/config.rs b/src/tools/rust-analyzer/crates/rust-analyzer/src/config.rs index 64054669df0e7..497fd67e92a76 100644 --- a/src/tools/rust-analyzer/crates/rust-analyzer/src/config.rs +++ b/src/tools/rust-analyzer/crates/rust-analyzer/src/config.rs @@ -1261,7 +1261,7 @@ impl Config { impl Config { pub fn assist(&self, source_root: Option) -> AssistConfig { AssistConfig { - snippet_cap: SnippetCap::new(self.experimental("snippetTextEdit")), + snippet_cap: self.snippet_cap(), allowed: None, insert_use: self.insert_use_config(source_root), prefer_no_std: self.imports_preferNoStd(source_root).to_owned(), @@ -1321,6 +1321,7 @@ impl Config { ExprFillDefaultDef::Todo => ExprFillDefaultMode::Todo, ExprFillDefaultDef::Default => ExprFillDefaultMode::Default, }, + snippet_cap: self.snippet_cap(), insert_use: self.insert_use_config(source_root), prefer_no_std: self.imports_preferNoStd(source_root).to_owned(), prefer_prelude: self.imports_preferPrelude(source_root).to_owned(), @@ -2007,8 +2008,10 @@ impl Config { *self.references_excludeTests() } - pub fn snippet_cap(&self) -> bool { - self.experimental("snippetTextEdit") + pub fn snippet_cap(&self) -> Option { + // FIXME: Also detect the proposed lsp version at caps.workspace.workspaceEdit.snippetEditSupport + // once lsp-types has it. + SnippetCap::new(self.experimental("snippetTextEdit")) } pub fn call_info(&self) -> CallInfoConfig { diff --git a/src/tools/rust-analyzer/crates/rust-analyzer/src/integrated_benchmarks.rs b/src/tools/rust-analyzer/crates/rust-analyzer/src/integrated_benchmarks.rs index 3b42e9ba36abc..1e2cd4339b307 100644 --- a/src/tools/rust-analyzer/crates/rust-analyzer/src/integrated_benchmarks.rs +++ b/src/tools/rust-analyzer/crates/rust-analyzer/src/integrated_benchmarks.rs @@ -289,6 +289,7 @@ fn integrated_diagnostics_benchmark() { disabled: Default::default(), expr_fill_default: Default::default(), style_lints: false, + snippet_cap: SnippetCap::new(true), insert_use: InsertUseConfig { granularity: ImportGranularity::Crate, enforce_granularity: false,