Skip to content

Commit e870cbc

Browse files
committed
Centralize client capabilities
1 parent a97e5eb commit e870cbc

File tree

6 files changed

+21
-17
lines changed

6 files changed

+21
-17
lines changed

crates/rust-analyzer/src/bin/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ mod args;
55

66
use lsp_server::Connection;
77

8-
use rust_analyzer::{cli, from_json, Config, Result};
8+
use rust_analyzer::{cli, config::Config, from_json, Result};
99

1010
use crate::args::HelpPrinted;
1111

crates/rust-analyzer/src/config.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,10 @@ use serde::Deserialize;
1515

1616
#[derive(Debug, Clone)]
1717
pub struct Config {
18+
pub client_caps: ClientCapsConfig,
1819
pub publish_decorations: bool,
1920
pub publish_diagnostics: bool,
2021
pub notifications: NotificationsConfig,
21-
pub supports_location_link: bool,
22-
pub line_folding_only: bool,
2322
pub inlay_hints: InlayHintsConfig,
2423
pub completion: CompletionConfig,
2524
pub call_info_full: bool,
@@ -58,6 +57,12 @@ impl Default for RustfmtConfig {
5857
}
5958
}
6059

60+
#[derive(Debug, Clone, Default)]
61+
pub struct ClientCapsConfig {
62+
pub location_link: bool,
63+
pub line_folding_only: bool,
64+
}
65+
6166
impl Default for Config {
6267
fn default() -> Self {
6368
Config {
@@ -67,8 +72,7 @@ impl Default for Config {
6772
workspace_loaded: true,
6873
cargo_toml_not_found: true,
6974
},
70-
supports_location_link: false,
71-
line_folding_only: false,
75+
client_caps: ClientCapsConfig::default(),
7276
inlay_hints: InlayHintsConfig {
7377
type_hints: true,
7478
parameter_hints: true,
@@ -97,11 +101,9 @@ impl Default for Config {
97101
impl Config {
98102
#[rustfmt::skip]
99103
pub fn update(&mut self, value: &serde_json::Value) {
100-
let line_folding_only = self.line_folding_only;
101-
let supports_location_link = self.supports_location_link;
104+
let client_caps = self.client_caps.clone();
102105
*self = Default::default();
103-
self.line_folding_only = line_folding_only;
104-
self.supports_location_link = supports_location_link;
106+
self.client_caps = client_caps;
105107

106108
set(value, "publishDecorations", &mut self.publish_decorations);
107109
set(value, "excludeGlobs", &mut self.exclude_globs);
@@ -157,10 +159,10 @@ impl Config {
157159

158160
pub fn update_caps(&mut self, caps: &TextDocumentClientCapabilities) {
159161
if let Some(value) = caps.definition.as_ref().and_then(|it| it.link_support) {
160-
self.supports_location_link = value;
162+
self.client_caps.location_link = value;
161163
}
162164
if let Some(value) = caps.folding_range.as_ref().and_then(|it| it.line_folding_only) {
163-
self.line_folding_only = value
165+
self.client_caps.line_folding_only = value
164166
}
165167
}
166168
}

crates/rust-analyzer/src/conv.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,7 @@ impl TryConvWith<&WorldSnapshot> for (FileId, RangeInfo<Vec<NavigationTarget>>)
579579
.into_iter()
580580
.map(|nav| (file_id, RangeInfo::new(range, nav)))
581581
.try_conv_with_to_vec(world)?;
582-
if world.config.supports_location_link {
582+
if world.config.client_caps.location_link {
583583
Ok(links.into())
584584
} else {
585585
let locations: Vec<Location> = links

crates/rust-analyzer/src/lib.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ mod conv;
3333
mod main_loop;
3434
mod markdown;
3535
pub mod req;
36-
mod config;
36+
pub mod config;
3737
mod world;
3838
mod diagnostics;
3939
mod semantic_tokens;
@@ -42,7 +42,6 @@ use serde::de::DeserializeOwned;
4242

4343
pub type Result<T> = std::result::Result<T, Box<dyn std::error::Error + Send + Sync>>;
4444
pub use crate::{
45-
config::Config,
4645
caps::server_capabilities,
4746
main_loop::LspError,
4847
main_loop::{main_loop, show_message},

crates/rust-analyzer/src/main_loop/handlers.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ pub fn handle_folding_range(
450450
let ctx = FoldConvCtx {
451451
text: &text,
452452
line_index: &line_index,
453-
line_folding_only: world.config.line_folding_only,
453+
line_folding_only: world.config.client_caps.line_folding_only,
454454
};
455455
let res = Some(folds.into_iter().map_conv_with(&ctx).collect());
456456
Ok(res)

crates/rust-analyzer/tests/heavy_tests/support.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ use tempfile::TempDir;
1919
use test_utils::{find_mismatch, parse_fixture};
2020

2121
use req::{ProgressParams, ProgressParamsValue};
22-
use rust_analyzer::{main_loop, req, Config};
22+
use rust_analyzer::{
23+
config::{ClientCapsConfig, Config},
24+
main_loop, req,
25+
};
2326

2427
pub struct Project<'a> {
2528
fixture: &'a str,
@@ -78,7 +81,7 @@ impl<'a> Project<'a> {
7881
let roots = self.roots.into_iter().map(|root| tmp_dir.path().join(root)).collect();
7982

8083
let mut config = Config {
81-
supports_location_link: true,
84+
client_caps: ClientCapsConfig { location_link: true, ..Default::default() },
8285
with_sysroot: self.with_sysroot,
8386
..Config::default()
8487
};

0 commit comments

Comments
 (0)