diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/rust-analyzer/src/config.rs | 68 | ||||
-rw-r--r-- | crates/rust-analyzer/src/main_loop.rs | 42 | ||||
-rw-r--r-- | crates/rust-analyzer/src/main_loop/handlers.rs | 26 | ||||
-rw-r--r-- | crates/rust-analyzer/src/world.rs | 18 |
4 files changed, 94 insertions, 60 deletions
diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs index 628ed107e..fb7895ce0 100644 --- a/crates/rust-analyzer/src/config.rs +++ b/crates/rust-analyzer/src/config.rs | |||
@@ -9,9 +9,77 @@ | |||
9 | 9 | ||
10 | use rustc_hash::FxHashMap; | 10 | use rustc_hash::FxHashMap; |
11 | 11 | ||
12 | use lsp_types::TextDocumentClientCapabilities; | ||
13 | use ra_flycheck::FlycheckConfig; | ||
14 | use ra_ide::InlayHintsConfig; | ||
12 | use ra_project_model::CargoFeatures; | 15 | use ra_project_model::CargoFeatures; |
13 | use serde::{Deserialize, Deserializer}; | 16 | use serde::{Deserialize, Deserializer}; |
14 | 17 | ||
18 | #[derive(Debug, Clone)] | ||
19 | pub struct Config { | ||
20 | pub publish_decorations: bool, | ||
21 | pub supports_location_link: bool, | ||
22 | pub line_folding_only: bool, | ||
23 | pub inlay_hints: InlayHintsConfig, | ||
24 | pub rustfmt: RustfmtConfig, | ||
25 | pub check: Option<FlycheckConfig>, | ||
26 | pub vscode_lldb: bool, | ||
27 | pub proc_macro_srv: Option<String>, | ||
28 | } | ||
29 | |||
30 | #[derive(Debug, Clone)] | ||
31 | pub enum RustfmtConfig { | ||
32 | Rustfmt { | ||
33 | extra_args: Vec<String>, | ||
34 | }, | ||
35 | #[allow(unused)] | ||
36 | CustomCommand { | ||
37 | command: String, | ||
38 | args: Vec<String>, | ||
39 | }, | ||
40 | } | ||
41 | |||
42 | impl Default for RustfmtConfig { | ||
43 | fn default() -> Self { | ||
44 | RustfmtConfig::Rustfmt { extra_args: Vec::new() } | ||
45 | } | ||
46 | } | ||
47 | |||
48 | pub(crate) fn get_config( | ||
49 | config: &ServerConfig, | ||
50 | text_document_caps: Option<&TextDocumentClientCapabilities>, | ||
51 | ) -> Config { | ||
52 | Config { | ||
53 | publish_decorations: config.publish_decorations, | ||
54 | supports_location_link: text_document_caps | ||
55 | .and_then(|it| it.definition) | ||
56 | .and_then(|it| it.link_support) | ||
57 | .unwrap_or(false), | ||
58 | line_folding_only: text_document_caps | ||
59 | .and_then(|it| it.folding_range.as_ref()) | ||
60 | .and_then(|it| it.line_folding_only) | ||
61 | .unwrap_or(false), | ||
62 | inlay_hints: InlayHintsConfig { | ||
63 | type_hints: config.inlay_hints_type, | ||
64 | parameter_hints: config.inlay_hints_parameter, | ||
65 | chaining_hints: config.inlay_hints_chaining, | ||
66 | max_length: config.inlay_hints_max_length, | ||
67 | }, | ||
68 | check: if config.cargo_watch_enable { | ||
69 | Some(FlycheckConfig::CargoCommand { | ||
70 | command: config.cargo_watch_command.clone(), | ||
71 | all_targets: config.cargo_watch_all_targets, | ||
72 | extra_args: config.cargo_watch_args.clone(), | ||
73 | }) | ||
74 | } else { | ||
75 | None | ||
76 | }, | ||
77 | rustfmt: RustfmtConfig::Rustfmt { extra_args: config.rustfmt_args.clone() }, | ||
78 | vscode_lldb: config.vscode_lldb, | ||
79 | proc_macro_srv: None, // FIXME: get this from config | ||
80 | } | ||
81 | } | ||
82 | |||
15 | /// Client provided initialization options | 83 | /// Client provided initialization options |
16 | #[derive(Deserialize, Clone, Debug, PartialEq, Eq)] | 84 | #[derive(Deserialize, Clone, Debug, PartialEq, Eq)] |
17 | #[serde(rename_all = "camelCase", default)] | 85 | #[serde(rename_all = "camelCase", default)] |
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs index a89ea86ea..de40e2ac2 100644 --- a/crates/rust-analyzer/src/main_loop.rs +++ b/crates/rust-analyzer/src/main_loop.rs | |||
@@ -21,8 +21,8 @@ use lsp_types::{ | |||
21 | WorkDoneProgressBegin, WorkDoneProgressCreateParams, WorkDoneProgressEnd, | 21 | WorkDoneProgressBegin, WorkDoneProgressCreateParams, WorkDoneProgressEnd, |
22 | WorkDoneProgressReport, | 22 | WorkDoneProgressReport, |
23 | }; | 23 | }; |
24 | use ra_flycheck::{url_from_path_with_drive_lowercasing, CheckTask, FlycheckConfig}; | 24 | use ra_flycheck::{url_from_path_with_drive_lowercasing, CheckTask}; |
25 | use ra_ide::{Canceled, FileId, InlayHintsConfig, LibraryData, SourceRootId}; | 25 | use ra_ide::{Canceled, FileId, LibraryData, SourceRootId}; |
26 | use ra_prof::profile; | 26 | use ra_prof::profile; |
27 | use ra_vfs::{VfsFile, VfsTask, Watch}; | 27 | use ra_vfs::{VfsFile, VfsTask, Watch}; |
28 | use relative_path::RelativePathBuf; | 28 | use relative_path::RelativePathBuf; |
@@ -31,6 +31,7 @@ use serde::{de::DeserializeOwned, Serialize}; | |||
31 | use threadpool::ThreadPool; | 31 | use threadpool::ThreadPool; |
32 | 32 | ||
33 | use crate::{ | 33 | use crate::{ |
34 | config::get_config, | ||
34 | diagnostics::DiagnosticTask, | 35 | diagnostics::DiagnosticTask, |
35 | feature_flags::FeatureFlags, | 36 | feature_flags::FeatureFlags, |
36 | main_loop::{ | 37 | main_loop::{ |
@@ -38,7 +39,7 @@ use crate::{ | |||
38 | subscriptions::Subscriptions, | 39 | subscriptions::Subscriptions, |
39 | }, | 40 | }, |
40 | req, | 41 | req, |
41 | world::{Config, WorldSnapshot, WorldState}, | 42 | world::{WorldSnapshot, WorldState}, |
42 | Result, ServerConfig, | 43 | Result, ServerConfig, |
43 | }; | 44 | }; |
44 | use req::ConfigurationParams; | 45 | use req::ConfigurationParams; |
@@ -81,41 +82,6 @@ fn get_feature_flags(config: &ServerConfig, connection: &Connection) -> FeatureF | |||
81 | ff | 82 | ff |
82 | } | 83 | } |
83 | 84 | ||
84 | fn get_config( | ||
85 | config: &ServerConfig, | ||
86 | text_document_caps: Option<&TextDocumentClientCapabilities>, | ||
87 | ) -> Config { | ||
88 | Config { | ||
89 | publish_decorations: config.publish_decorations, | ||
90 | supports_location_link: text_document_caps | ||
91 | .and_then(|it| it.definition) | ||
92 | .and_then(|it| it.link_support) | ||
93 | .unwrap_or(false), | ||
94 | line_folding_only: text_document_caps | ||
95 | .and_then(|it| it.folding_range.as_ref()) | ||
96 | .and_then(|it| it.line_folding_only) | ||
97 | .unwrap_or(false), | ||
98 | inlay_hints: InlayHintsConfig { | ||
99 | type_hints: config.inlay_hints_type, | ||
100 | parameter_hints: config.inlay_hints_parameter, | ||
101 | chaining_hints: config.inlay_hints_chaining, | ||
102 | max_length: config.inlay_hints_max_length, | ||
103 | }, | ||
104 | check: if config.cargo_watch_enable { | ||
105 | Some(FlycheckConfig::CargoCommand { | ||
106 | command: config.cargo_watch_command.clone(), | ||
107 | all_targets: config.cargo_watch_all_targets, | ||
108 | extra_args: config.cargo_watch_args.clone(), | ||
109 | }) | ||
110 | } else { | ||
111 | None | ||
112 | }, | ||
113 | rustfmt_args: config.rustfmt_args.clone(), | ||
114 | vscode_lldb: config.vscode_lldb, | ||
115 | proc_macro_srv: None, // FIXME: get this from config | ||
116 | } | ||
117 | } | ||
118 | |||
119 | pub fn main_loop( | 85 | pub fn main_loop( |
120 | ws_roots: Vec<PathBuf>, | 86 | ws_roots: Vec<PathBuf>, |
121 | client_caps: ClientCapabilities, | 87 | client_caps: ClientCapabilities, |
diff --git a/crates/rust-analyzer/src/main_loop/handlers.rs b/crates/rust-analyzer/src/main_loop/handlers.rs index d5cb5d137..bb99b38a8 100644 --- a/crates/rust-analyzer/src/main_loop/handlers.rs +++ b/crates/rust-analyzer/src/main_loop/handlers.rs | |||
@@ -31,6 +31,7 @@ use stdx::format_to; | |||
31 | 31 | ||
32 | use crate::{ | 32 | use crate::{ |
33 | cargo_target_spec::CargoTargetSpec, | 33 | cargo_target_spec::CargoTargetSpec, |
34 | config::RustfmtConfig, | ||
34 | conv::{ | 35 | conv::{ |
35 | to_call_hierarchy_item, to_location, Conv, ConvWith, FoldConvCtx, MapConvWith, TryConvWith, | 36 | to_call_hierarchy_item, to_location, Conv, ConvWith, FoldConvCtx, MapConvWith, TryConvWith, |
36 | TryConvWithToVec, | 37 | TryConvWithToVec, |
@@ -610,13 +611,24 @@ pub fn handle_formatting( | |||
610 | let file_line_index = world.analysis().file_line_index(file_id)?; | 611 | let file_line_index = world.analysis().file_line_index(file_id)?; |
611 | let end_position = TextUnit::of_str(&file).conv_with(&file_line_index); | 612 | let end_position = TextUnit::of_str(&file).conv_with(&file_line_index); |
612 | 613 | ||
613 | let mut rustfmt = process::Command::new("rustfmt"); | 614 | let mut rustfmt = match &world.config.rustfmt { |
614 | rustfmt.args(&world.config.rustfmt_args); | 615 | RustfmtConfig::Rustfmt { extra_args } => { |
615 | if let Some(&crate_id) = crate_ids.first() { | 616 | let mut cmd = process::Command::new("rustfmt"); |
616 | // Assume all crates are in the same edition | 617 | cmd.args(extra_args); |
617 | let edition = world.analysis().crate_edition(crate_id)?; | 618 | if let Some(&crate_id) = crate_ids.first() { |
618 | rustfmt.args(&["--edition", &edition.to_string()]); | 619 | // Assume all crates are in the same edition |
619 | } | 620 | let edition = world.analysis().crate_edition(crate_id)?; |
621 | cmd.arg("--edition"); | ||
622 | cmd.arg(edition.to_string()); | ||
623 | } | ||
624 | cmd | ||
625 | } | ||
626 | RustfmtConfig::CustomCommand { command, args } => { | ||
627 | let mut cmd = process::Command::new(command); | ||
628 | cmd.args(args); | ||
629 | cmd | ||
630 | } | ||
631 | }; | ||
620 | 632 | ||
621 | if let Ok(path) = params.text_document.uri.to_file_path() { | 633 | if let Ok(path) = params.text_document.uri.to_file_path() { |
622 | if let Some(parent) = path.parent() { | 634 | if let Some(parent) = path.parent() { |
diff --git a/crates/rust-analyzer/src/world.rs b/crates/rust-analyzer/src/world.rs index 2db058eb1..124de4d8e 100644 --- a/crates/rust-analyzer/src/world.rs +++ b/crates/rust-analyzer/src/world.rs | |||
@@ -11,10 +11,9 @@ use std::{ | |||
11 | use crossbeam_channel::{unbounded, Receiver}; | 11 | use crossbeam_channel::{unbounded, Receiver}; |
12 | use lsp_types::Url; | 12 | use lsp_types::Url; |
13 | use parking_lot::RwLock; | 13 | use parking_lot::RwLock; |
14 | use ra_flycheck::{url_from_path_with_drive_lowercasing, Flycheck, FlycheckConfig}; | 14 | use ra_flycheck::{url_from_path_with_drive_lowercasing, Flycheck}; |
15 | use ra_ide::{ | 15 | use ra_ide::{ |
16 | Analysis, AnalysisChange, AnalysisHost, CrateGraph, FileId, InlayHintsConfig, LibraryData, | 16 | Analysis, AnalysisChange, AnalysisHost, CrateGraph, FileId, LibraryData, SourceRootId, |
17 | SourceRootId, | ||
18 | }; | 17 | }; |
19 | use ra_project_model::{get_rustc_cfg_options, ProcMacroClient, ProjectWorkspace}; | 18 | use ra_project_model::{get_rustc_cfg_options, ProcMacroClient, ProjectWorkspace}; |
20 | use ra_vfs::{LineEndings, RootEntry, Vfs, VfsChange, VfsFile, VfsRoot, VfsTask, Watch}; | 19 | use ra_vfs::{LineEndings, RootEntry, Vfs, VfsChange, VfsFile, VfsRoot, VfsTask, Watch}; |
@@ -22,6 +21,7 @@ use relative_path::RelativePathBuf; | |||
22 | use stdx::format_to; | 21 | use stdx::format_to; |
23 | 22 | ||
24 | use crate::{ | 23 | use crate::{ |
24 | config::Config, | ||
25 | diagnostics::{CheckFixes, DiagnosticCollection}, | 25 | diagnostics::{CheckFixes, DiagnosticCollection}, |
26 | feature_flags::FeatureFlags, | 26 | feature_flags::FeatureFlags, |
27 | main_loop::pending_requests::{CompletedRequest, LatestRequests}, | 27 | main_loop::pending_requests::{CompletedRequest, LatestRequests}, |
@@ -51,18 +51,6 @@ fn create_flycheck(workspaces: &[ProjectWorkspace], config: &Config) -> Option<F | |||
51 | }) | 51 | }) |
52 | } | 52 | } |
53 | 53 | ||
54 | #[derive(Debug, Clone)] | ||
55 | pub struct Config { | ||
56 | pub publish_decorations: bool, | ||
57 | pub supports_location_link: bool, | ||
58 | pub line_folding_only: bool, | ||
59 | pub inlay_hints: InlayHintsConfig, | ||
60 | pub rustfmt_args: Vec<String>, | ||
61 | pub check: Option<FlycheckConfig>, | ||
62 | pub vscode_lldb: bool, | ||
63 | pub proc_macro_srv: Option<String>, | ||
64 | } | ||
65 | |||
66 | /// `WorldState` is the primary mutable state of the language server | 54 | /// `WorldState` is the primary mutable state of the language server |
67 | /// | 55 | /// |
68 | /// The most interesting components are `vfs`, which stores a consistent | 56 | /// The most interesting components are `vfs`, which stores a consistent |