Skip to content

Commit d5f7b2e

Browse files
bors[bot]euclio
andauthored
Merge #9028
9028: only advertise range formatting support if enabled r=Veykril a=euclio Fixes #9009. Co-authored-by: Andy Russell <[email protected]>
2 parents 2968731 + a0cd7fe commit d5f7b2e

File tree

3 files changed

+47
-51
lines changed

3 files changed

+47
-51
lines changed

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

Lines changed: 38 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -158,19 +158,32 @@ fn run_server() -> Result<()> {
158158
let initialize_params =
159159
from_json::<lsp_types::InitializeParams>("InitializeParams", initialize_params)?;
160160

161-
let server_capabilities = rust_analyzer::server_capabilities(&initialize_params.capabilities);
161+
let root_path = match initialize_params
162+
.root_uri
163+
.and_then(|it| it.to_file_path().ok())
164+
.and_then(|it| AbsPathBuf::try_from(it).ok())
165+
{
166+
Some(it) => it,
167+
None => {
168+
let cwd = env::current_dir()?;
169+
AbsPathBuf::assert(cwd)
170+
}
171+
};
172+
173+
let mut config = Config::new(root_path, initialize_params.capabilities);
174+
if let Some(json) = initialize_params.initialization_options {
175+
config.update(json);
176+
}
177+
178+
let server_capabilities = rust_analyzer::server_capabilities(&config);
162179

163180
let initialize_result = lsp_types::InitializeResult {
164181
capabilities: server_capabilities,
165182
server_info: Some(lsp_types::ServerInfo {
166183
name: String::from("rust-analyzer"),
167184
version: Some(String::from(env!("REV"))),
168185
}),
169-
offset_encoding: if supports_utf8(&initialize_params.capabilities) {
170-
Some("utf-8".to_string())
171-
} else {
172-
None
173-
},
186+
offset_encoding: if supports_utf8(&config.caps) { Some("utf-8".to_string()) } else { None },
174187
};
175188

176189
let initialize_result = serde_json::to_value(initialize_result).unwrap();
@@ -181,47 +194,26 @@ fn run_server() -> Result<()> {
181194
log::info!("Client '{}' {}", client_info.name, client_info.version.unwrap_or_default());
182195
}
183196

184-
let config = {
185-
let root_path = match initialize_params
186-
.root_uri
187-
.and_then(|it| it.to_file_path().ok())
188-
.and_then(|it| AbsPathBuf::try_from(it).ok())
189-
{
190-
Some(it) => it,
191-
None => {
192-
let cwd = env::current_dir()?;
193-
AbsPathBuf::assert(cwd)
194-
}
195-
};
196-
197-
let mut config = Config::new(root_path, initialize_params.capabilities);
198-
if let Some(json) = initialize_params.initialization_options {
199-
config.update(json);
200-
}
201-
202-
if config.linked_projects().is_empty() && config.detached_files().is_empty() {
203-
let workspace_roots = initialize_params
204-
.workspace_folders
205-
.map(|workspaces| {
206-
workspaces
207-
.into_iter()
208-
.filter_map(|it| it.uri.to_file_path().ok())
209-
.filter_map(|it| AbsPathBuf::try_from(it).ok())
210-
.collect::<Vec<_>>()
211-
})
212-
.filter(|workspaces| !workspaces.is_empty())
213-
.unwrap_or_else(|| vec![config.root_path.clone()]);
214-
215-
let discovered = ProjectManifest::discover_all(&workspace_roots);
216-
log::info!("discovered projects: {:?}", discovered);
217-
if discovered.is_empty() {
218-
log::error!("failed to find any projects in {:?}", workspace_roots);
219-
}
220-
config.discovered_projects = Some(discovered);
197+
if config.linked_projects().is_empty() && config.detached_files().is_empty() {
198+
let workspace_roots = initialize_params
199+
.workspace_folders
200+
.map(|workspaces| {
201+
workspaces
202+
.into_iter()
203+
.filter_map(|it| it.uri.to_file_path().ok())
204+
.filter_map(|it| AbsPathBuf::try_from(it).ok())
205+
.collect::<Vec<_>>()
206+
})
207+
.filter(|workspaces| !workspaces.is_empty())
208+
.unwrap_or_else(|| vec![config.root_path.clone()]);
209+
210+
let discovered = ProjectManifest::discover_all(&workspace_roots);
211+
log::info!("discovered projects: {:?}", discovered);
212+
if discovered.is_empty() {
213+
log::error!("failed to find any projects in {:?}", workspace_roots);
221214
}
222-
223-
config
224-
};
215+
config.discovered_projects = Some(discovered);
216+
}
225217

226218
rust_analyzer::main_loop(config, connection)?;
227219

crates/rust-analyzer/src/caps.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@ use lsp_types::{
1313
};
1414
use serde_json::json;
1515

16+
use crate::config::{Config, RustfmtConfig};
1617
use crate::semantic_tokens;
1718

18-
pub fn server_capabilities(client_caps: &ClientCapabilities) -> ServerCapabilities {
19+
pub fn server_capabilities(config: &Config) -> ServerCapabilities {
1920
ServerCapabilities {
2021
text_document_sync: Some(TextDocumentSyncCapability::Options(TextDocumentSyncOptions {
2122
open_close: Some(true),
@@ -26,7 +27,7 @@ pub fn server_capabilities(client_caps: &ClientCapabilities) -> ServerCapabiliti
2627
})),
2728
hover_provider: Some(HoverProviderCapability::Simple(true)),
2829
completion_provider: Some(CompletionOptions {
29-
resolve_provider: completions_resolve_provider(client_caps),
30+
resolve_provider: completions_resolve_provider(&config.caps),
3031
trigger_characters: Some(vec![":".to_string(), ".".to_string(), "'".to_string()]),
3132
all_commit_characters: None,
3233
completion_item: None,
@@ -45,10 +46,13 @@ pub fn server_capabilities(client_caps: &ClientCapabilities) -> ServerCapabiliti
4546
document_highlight_provider: Some(OneOf::Left(true)),
4647
document_symbol_provider: Some(OneOf::Left(true)),
4748
workspace_symbol_provider: Some(OneOf::Left(true)),
48-
code_action_provider: Some(code_action_capabilities(client_caps)),
49+
code_action_provider: Some(code_action_capabilities(&config.caps)),
4950
code_lens_provider: Some(CodeLensOptions { resolve_provider: Some(true) }),
5051
document_formatting_provider: Some(OneOf::Left(true)),
51-
document_range_formatting_provider: Some(OneOf::Left(true)),
52+
document_range_formatting_provider: match config.rustfmt() {
53+
RustfmtConfig::Rustfmt { enable_range_formatting: true, .. } => Some(OneOf::Left(true)),
54+
_ => Some(OneOf::Left(false)),
55+
},
5256
document_on_type_formatting_provider: Some(DocumentOnTypeFormattingOptions {
5357
first_trigger_character: "=".to_string(),
5458
more_trigger_character: Some(vec![".".to_string(), ">".to_string(), "{".to_string()]),

crates/rust-analyzer/src/config.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ impl Default for ConfigData {
238238

239239
#[derive(Debug, Clone)]
240240
pub struct Config {
241-
caps: lsp_types::ClientCapabilities,
241+
pub caps: lsp_types::ClientCapabilities,
242242
data: ConfigData,
243243
detached_files: Vec<AbsPathBuf>,
244244
pub discovered_projects: Option<Vec<ProjectManifest>>,

0 commit comments

Comments
 (0)