From e870cbc23d78f5bc424983b1d9ef945888f9dc49 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 1 Apr 2020 18:46:26 +0200 Subject: Centralize client capabilities --- crates/rust-analyzer/src/bin/main.rs | 2 +- crates/rust-analyzer/src/config.rs | 22 ++++++++++++---------- crates/rust-analyzer/src/conv.rs | 2 +- crates/rust-analyzer/src/lib.rs | 3 +-- crates/rust-analyzer/src/main_loop/handlers.rs | 2 +- crates/rust-analyzer/tests/heavy_tests/support.rs | 7 +++++-- 6 files changed, 21 insertions(+), 17 deletions(-) diff --git a/crates/rust-analyzer/src/bin/main.rs b/crates/rust-analyzer/src/bin/main.rs index 483f50ce6..a3897b728 100644 --- a/crates/rust-analyzer/src/bin/main.rs +++ b/crates/rust-analyzer/src/bin/main.rs @@ -5,7 +5,7 @@ mod args; use lsp_server::Connection; -use rust_analyzer::{cli, from_json, Config, Result}; +use rust_analyzer::{cli, config::Config, from_json, Result}; use crate::args::HelpPrinted; diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs index c07626e5c..e72017dcc 100644 --- a/crates/rust-analyzer/src/config.rs +++ b/crates/rust-analyzer/src/config.rs @@ -15,11 +15,10 @@ use serde::Deserialize; #[derive(Debug, Clone)] pub struct Config { + pub client_caps: ClientCapsConfig, pub publish_decorations: bool, pub publish_diagnostics: bool, pub notifications: NotificationsConfig, - pub supports_location_link: bool, - pub line_folding_only: bool, pub inlay_hints: InlayHintsConfig, pub completion: CompletionConfig, pub call_info_full: bool, @@ -58,6 +57,12 @@ impl Default for RustfmtConfig { } } +#[derive(Debug, Clone, Default)] +pub struct ClientCapsConfig { + pub location_link: bool, + pub line_folding_only: bool, +} + impl Default for Config { fn default() -> Self { Config { @@ -67,8 +72,7 @@ impl Default for Config { workspace_loaded: true, cargo_toml_not_found: true, }, - supports_location_link: false, - line_folding_only: false, + client_caps: ClientCapsConfig::default(), inlay_hints: InlayHintsConfig { type_hints: true, parameter_hints: true, @@ -97,11 +101,9 @@ impl Default for Config { impl Config { #[rustfmt::skip] pub fn update(&mut self, value: &serde_json::Value) { - let line_folding_only = self.line_folding_only; - let supports_location_link = self.supports_location_link; + let client_caps = self.client_caps.clone(); *self = Default::default(); - self.line_folding_only = line_folding_only; - self.supports_location_link = supports_location_link; + self.client_caps = client_caps; set(value, "publishDecorations", &mut self.publish_decorations); set(value, "excludeGlobs", &mut self.exclude_globs); @@ -157,10 +159,10 @@ impl Config { pub fn update_caps(&mut self, caps: &TextDocumentClientCapabilities) { if let Some(value) = caps.definition.as_ref().and_then(|it| it.link_support) { - self.supports_location_link = value; + self.client_caps.location_link = value; } if let Some(value) = caps.folding_range.as_ref().and_then(|it| it.line_folding_only) { - self.line_folding_only = value + self.client_caps.line_folding_only = value } } } diff --git a/crates/rust-analyzer/src/conv.rs b/crates/rust-analyzer/src/conv.rs index e8dc953c3..57c4c8ce5 100644 --- a/crates/rust-analyzer/src/conv.rs +++ b/crates/rust-analyzer/src/conv.rs @@ -579,7 +579,7 @@ impl TryConvWith<&WorldSnapshot> for (FileId, RangeInfo>) .into_iter() .map(|nav| (file_id, RangeInfo::new(range, nav))) .try_conv_with_to_vec(world)?; - if world.config.supports_location_link { + if world.config.client_caps.location_link { Ok(links.into()) } else { let locations: Vec = links diff --git a/crates/rust-analyzer/src/lib.rs b/crates/rust-analyzer/src/lib.rs index 6062d0984..02953be30 100644 --- a/crates/rust-analyzer/src/lib.rs +++ b/crates/rust-analyzer/src/lib.rs @@ -33,7 +33,7 @@ mod conv; mod main_loop; mod markdown; pub mod req; -mod config; +pub mod config; mod world; mod diagnostics; mod semantic_tokens; @@ -42,7 +42,6 @@ use serde::de::DeserializeOwned; pub type Result = std::result::Result>; pub use crate::{ - config::Config, caps::server_capabilities, main_loop::LspError, main_loop::{main_loop, show_message}, diff --git a/crates/rust-analyzer/src/main_loop/handlers.rs b/crates/rust-analyzer/src/main_loop/handlers.rs index d0f64f007..23e48c089 100644 --- a/crates/rust-analyzer/src/main_loop/handlers.rs +++ b/crates/rust-analyzer/src/main_loop/handlers.rs @@ -450,7 +450,7 @@ pub fn handle_folding_range( let ctx = FoldConvCtx { text: &text, line_index: &line_index, - line_folding_only: world.config.line_folding_only, + line_folding_only: world.config.client_caps.line_folding_only, }; let res = Some(folds.into_iter().map_conv_with(&ctx).collect()); Ok(res) diff --git a/crates/rust-analyzer/tests/heavy_tests/support.rs b/crates/rust-analyzer/tests/heavy_tests/support.rs index c83cb8adb..7eebedff7 100644 --- a/crates/rust-analyzer/tests/heavy_tests/support.rs +++ b/crates/rust-analyzer/tests/heavy_tests/support.rs @@ -19,7 +19,10 @@ use tempfile::TempDir; use test_utils::{find_mismatch, parse_fixture}; use req::{ProgressParams, ProgressParamsValue}; -use rust_analyzer::{main_loop, req, Config}; +use rust_analyzer::{ + config::{ClientCapsConfig, Config}, + main_loop, req, +}; pub struct Project<'a> { fixture: &'a str, @@ -78,7 +81,7 @@ impl<'a> Project<'a> { let roots = self.roots.into_iter().map(|root| tmp_dir.path().join(root)).collect(); let mut config = Config { - supports_location_link: true, + client_caps: ClientCapsConfig { location_link: true, ..Default::default() }, with_sysroot: self.with_sysroot, ..Config::default() }; -- cgit v1.2.3