Skip to content

Commit 3c9e9d3

Browse files
bors[bot]matklad
andauthored
Merge #3824
3824: New config names r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
2 parents 9ee96dc + 7a4ebd2 commit 3c9e9d3

File tree

10 files changed

+229
-256
lines changed

10 files changed

+229
-256
lines changed

crates/rust-analyzer/src/config.rs

Lines changed: 66 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,33 @@ use serde::Deserialize;
1616
#[derive(Debug, Clone)]
1717
pub struct Config {
1818
pub client_caps: ClientCapsConfig,
19+
20+
pub with_sysroot: bool,
1921
pub publish_diagnostics: bool,
22+
pub lru_capacity: Option<usize>,
23+
pub proc_macro_srv: Option<String>,
24+
pub files: FilesConfig,
2025
pub notifications: NotificationsConfig,
26+
27+
pub cargo: CargoConfig,
28+
pub rustfmt: RustfmtConfig,
29+
pub check: Option<FlycheckConfig>,
30+
2131
pub inlay_hints: InlayHintsConfig,
2232
pub completion: CompletionConfig,
2333
pub call_info_full: bool,
24-
pub rustfmt: RustfmtConfig,
25-
pub check: Option<FlycheckConfig>,
26-
pub vscode_lldb: bool,
27-
pub proc_macro_srv: Option<String>,
28-
pub lru_capacity: Option<usize>,
29-
pub use_client_watching: bool,
30-
pub exclude_globs: Vec<String>,
31-
pub cargo: CargoConfig,
32-
pub with_sysroot: bool,
34+
}
35+
36+
#[derive(Debug, Clone)]
37+
pub struct FilesConfig {
38+
pub watcher: FilesWatcher,
39+
pub exclude: Vec<String>,
40+
}
41+
42+
#[derive(Debug, Clone)]
43+
pub enum FilesWatcher {
44+
Client,
45+
Notify,
3346
}
3447

3548
#[derive(Debug, Clone)]
@@ -59,12 +72,26 @@ pub struct ClientCapsConfig {
5972
impl Default for Config {
6073
fn default() -> Self {
6174
Config {
75+
client_caps: ClientCapsConfig::default(),
76+
77+
with_sysroot: true,
6278
publish_diagnostics: true,
79+
lru_capacity: None,
80+
proc_macro_srv: None,
81+
files: FilesConfig { watcher: FilesWatcher::Notify, exclude: Vec::new() },
6382
notifications: NotificationsConfig {
6483
workspace_loaded: true,
6584
cargo_toml_not_found: true,
6685
},
67-
client_caps: ClientCapsConfig::default(),
86+
87+
cargo: CargoConfig::default(),
88+
rustfmt: RustfmtConfig::Rustfmt { extra_args: Vec::new() },
89+
check: Some(FlycheckConfig::CargoCommand {
90+
command: "check".to_string(),
91+
all_targets: true,
92+
extra_args: Vec::new(),
93+
}),
94+
6895
inlay_hints: InlayHintsConfig {
6996
type_hints: true,
7097
parameter_hints: true,
@@ -77,19 +104,6 @@ impl Default for Config {
77104
add_call_argument_snippets: true,
78105
},
79106
call_info_full: true,
80-
rustfmt: RustfmtConfig::Rustfmt { extra_args: Vec::new() },
81-
check: Some(FlycheckConfig::CargoCommand {
82-
command: "check".to_string(),
83-
all_targets: true,
84-
extra_args: Vec::new(),
85-
}),
86-
vscode_lldb: false,
87-
proc_macro_srv: None,
88-
lru_capacity: None,
89-
use_client_watching: false,
90-
exclude_globs: Vec::new(),
91-
cargo: CargoConfig::default(),
92-
with_sysroot: true,
93107
}
94108
}
95109
}
@@ -103,45 +117,44 @@ impl Config {
103117
*self = Default::default();
104118
self.client_caps = client_caps;
105119

106-
set(value, "/excludeGlobs", &mut self.exclude_globs);
107-
set(value, "/useClientWatching", &mut self.use_client_watching);
120+
set(value, "/withSysroot", &mut self.with_sysroot);
121+
set(value, "/featureFlags/lsp.diagnostics", &mut self.publish_diagnostics);
108122
set(value, "/lruCapacity", &mut self.lru_capacity);
123+
if let Some(watcher) = get::<String>(value, "/files/watcher") {
124+
self.files.watcher = match watcher.as_str() {
125+
"client" => FilesWatcher::Client,
126+
"notify"| _ => FilesWatcher::Notify,
127+
}
128+
}
129+
set(value, "/notifications/workspaceLoaded", &mut self.notifications.workspace_loaded);
130+
set(value, "/notifications/cargoTomlNotFound", &mut self.notifications.cargo_toml_not_found);
109131

110-
set(value, "/inlayHintsType", &mut self.inlay_hints.type_hints);
111-
set(value, "/inlayHintsParameter", &mut self.inlay_hints.parameter_hints);
112-
set(value, "/inlayHintsChaining", &mut self.inlay_hints.chaining_hints);
113-
set(value, "/inlayHintsMaxLength", &mut self.inlay_hints.max_length);
114-
115-
if let Some(false) = get(value, "cargo_watch_enable") {
132+
set(value, "/cargo/noDefaultFeatures", &mut self.cargo.no_default_features);
133+
set(value, "/cargo/allFeatures", &mut self.cargo.all_features);
134+
set(value, "/cargo/features", &mut self.cargo.features);
135+
set(value, "/cargo/loadOutDirsFromCheck", &mut self.cargo.load_out_dirs_from_check);
136+
if let RustfmtConfig::Rustfmt { extra_args } = &mut self.rustfmt {
137+
set(value, "/rustfmt/extraArgs", extra_args);
138+
}
139+
if let Some(false) = get(value, "/checkOnSave/enable") {
116140
self.check = None
117141
} else {
118142
if let Some(FlycheckConfig::CargoCommand { command, extra_args, all_targets }) = &mut self.check
119143
{
120-
set(value, "/cargoWatchArgs", extra_args);
121-
set(value, "/cargoWatchCommand", command);
122-
set(value, "/cargoWatchAllTargets", all_targets);
144+
set(value, "/checkOnSave/extraArgs", extra_args);
145+
set(value, "/checkOnSave/command", command);
146+
set(value, "/checkOnSave/allTargets", all_targets);
123147
}
124148
};
125149

126-
set(value, "/withSysroot", &mut self.with_sysroot);
127-
if let RustfmtConfig::Rustfmt { extra_args } = &mut self.rustfmt {
128-
set(value, "/rustfmtArgs", extra_args);
129-
}
130-
131-
set(value, "/cargoFeatures/noDefaultFeatures", &mut self.cargo.no_default_features);
132-
set(value, "/cargoFeatures/allFeatures", &mut self.cargo.all_features);
133-
set(value, "/cargoFeatures/features", &mut self.cargo.features);
134-
set(value, "/cargoFeatures/loadOutDirsFromCheck", &mut self.cargo.load_out_dirs_from_check);
135-
136-
set(value, "/vscodeLldb", &mut self.vscode_lldb);
137-
138-
set(value, "/featureFlags/lsp.diagnostics", &mut self.publish_diagnostics);
139-
set(value, "/featureFlags/notifications.workspace-loaded", &mut self.notifications.workspace_loaded);
140-
set(value, "/featureFlags/notifications.cargo-toml-not-found", &mut self.notifications.cargo_toml_not_found);
141-
set(value, "/featureFlags/completion.enable-postfix", &mut self.completion.enable_postfix_completions);
142-
set(value, "/featureFlags/completion.insertion.add-call-parenthesis", &mut self.completion.add_call_parenthesis);
143-
set(value, "/featureFlags/completion.insertion.add-argument-snippets", &mut self.completion.add_call_argument_snippets);
144-
set(value, "/featureFlags/call-info.full", &mut self.call_info_full);
150+
set(value, "/inlayHints/typeHints", &mut self.inlay_hints.type_hints);
151+
set(value, "/inlayHints/parameterHints", &mut self.inlay_hints.parameter_hints);
152+
set(value, "/inlayHints/chainingHints", &mut self.inlay_hints.chaining_hints);
153+
set(value, "/inlayHints/maxLength", &mut self.inlay_hints.max_length);
154+
set(value, "/completion/postfix/enable", &mut self.completion.enable_postfix_completions);
155+
set(value, "/completion/addCallParenthesis", &mut self.completion.add_call_parenthesis);
156+
set(value, "/completion/addCallArgumentSnippets", &mut self.completion.add_call_argument_snippets);
157+
set(value, "/callInfo/full", &mut self.call_info_full);
145158

146159
log::info!("Config::update() = {:#?}", self);
147160

crates/rust-analyzer/src/main_loop.rs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use serde::{de::DeserializeOwned, Serialize};
3030
use threadpool::ThreadPool;
3131

3232
use crate::{
33-
config::Config,
33+
config::{Config, FilesWatcher},
3434
diagnostics::DiagnosticTask,
3535
main_loop::{
3636
pending_requests::{PendingRequest, PendingRequests},
@@ -40,7 +40,6 @@ use crate::{
4040
world::{WorldSnapshot, WorldState},
4141
Result,
4242
};
43-
use req::ConfigurationParams;
4443

4544
#[derive(Debug)]
4645
pub struct LspError {
@@ -122,12 +121,13 @@ pub fn main_loop(ws_roots: Vec<PathBuf>, config: Config, connection: Connection)
122121
};
123122

124123
let globs = config
125-
.exclude_globs
124+
.files
125+
.exclude
126126
.iter()
127127
.map(|glob| crate::vfs_glob::Glob::new(glob))
128128
.collect::<std::result::Result<Vec<_>, _>>()?;
129129

130-
if config.use_client_watching {
130+
if let FilesWatcher::Client = config.files.watcher {
131131
let registration_options = req::DidChangeWatchedFilesRegistrationOptions {
132132
watchers: workspaces
133133
.iter()
@@ -153,7 +153,7 @@ pub fn main_loop(ws_roots: Vec<PathBuf>, config: Config, connection: Connection)
153153
workspaces,
154154
config.lru_capacity,
155155
&globs,
156-
Watch(!config.use_client_watching),
156+
Watch(matches!(config.files.watcher, FilesWatcher::Notify)),
157157
config,
158158
)
159159
};
@@ -607,7 +607,12 @@ fn on_notification(
607607
let request_id = loop_state.next_request_id();
608608
let request = request_new::<req::WorkspaceConfiguration>(
609609
request_id.clone(),
610-
ConfigurationParams::default(),
610+
req::ConfigurationParams {
611+
items: vec![req::ConfigurationItem {
612+
scope_uri: None,
613+
section: Some("rust-analyzer".to_string()),
614+
}],
615+
},
611616
);
612617
msg_sender.send(request.into())?;
613618
loop_state.configuration_request_id = Some(request_id);
@@ -884,10 +889,9 @@ fn update_file_notifications_on_threadpool(
884889
subscriptions: Vec<FileId>,
885890
) {
886891
log::trace!("updating notifications for {:?}", subscriptions);
887-
let publish_diagnostics = world.config.publish_diagnostics;
888-
pool.execute(move || {
889-
for file_id in subscriptions {
890-
if publish_diagnostics {
892+
if world.config.publish_diagnostics {
893+
pool.execute(move || {
894+
for file_id in subscriptions {
891895
match handlers::publish_diagnostics(&world, file_id) {
892896
Err(e) => {
893897
if !is_canceled(&e) {
@@ -899,8 +903,8 @@ fn update_file_notifications_on_threadpool(
899903
}
900904
}
901905
}
902-
}
903-
});
906+
})
907+
}
904908
}
905909

906910
pub fn show_message(typ: req::MessageType, message: impl Into<String>, sender: &Sender<Message>) {

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

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -810,23 +810,21 @@ pub fn handle_code_lens(
810810
};
811811
lenses.push(lens);
812812

813-
if world.config.vscode_lldb {
814-
if r.args[0] == "run" {
815-
r.args[0] = "build".into();
816-
} else {
817-
r.args.push("--no-run".into());
818-
}
819-
let debug_lens = CodeLens {
820-
range: r.range,
821-
command: Some(Command {
822-
title: "Debug".into(),
823-
command: "rust-analyzer.debugSingle".into(),
824-
arguments: Some(vec![to_value(r).unwrap()]),
825-
}),
826-
data: None,
827-
};
828-
lenses.push(debug_lens);
813+
if r.args[0] == "run" {
814+
r.args[0] = "build".into();
815+
} else {
816+
r.args.push("--no-run".into());
829817
}
818+
let debug_lens = CodeLens {
819+
range: r.range,
820+
command: Some(Command {
821+
title: "Debug".into(),
822+
command: "rust-analyzer.debugSingle".into(),
823+
arguments: Some(vec![to_value(r).unwrap()]),
824+
}),
825+
data: None,
826+
};
827+
lenses.push(debug_lens);
830828
}
831829

832830
// Handle impls

crates/rust-analyzer/src/req.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ use serde::{Deserialize, Serialize};
66

77
pub use lsp_types::{
88
notification::*, request::*, ApplyWorkspaceEditParams, CodeActionParams, CodeLens,
9-
CodeLensParams, CompletionParams, CompletionResponse, ConfigurationParams, DiagnosticTag,
10-
DidChangeConfigurationParams, DidChangeWatchedFilesParams,
9+
CodeLensParams, CompletionParams, CompletionResponse, ConfigurationItem, ConfigurationParams,
10+
DiagnosticTag, DidChangeConfigurationParams, DidChangeWatchedFilesParams,
1111
DidChangeWatchedFilesRegistrationOptions, DocumentOnTypeFormattingParams, DocumentSymbolParams,
1212
DocumentSymbolResponse, FileSystemWatcher, Hover, InitializeResult, MessageType,
1313
PartialResultParams, ProgressParams, ProgressParamsValue, ProgressToken,

0 commit comments

Comments
 (0)