diff options
-rw-r--r-- | crates/ra_ide/src/feature_flags.rs | 1 | ||||
-rw-r--r-- | crates/ra_lsp_server/src/main_loop.rs | 39 | ||||
-rw-r--r-- | crates/ra_project_model/src/lib.rs | 14 | ||||
-rw-r--r-- | docs/user/README.md | 2 |
4 files changed, 37 insertions, 19 deletions
diff --git a/crates/ra_ide/src/feature_flags.rs b/crates/ra_ide/src/feature_flags.rs index de4ae513d..85617640d 100644 --- a/crates/ra_ide/src/feature_flags.rs +++ b/crates/ra_ide/src/feature_flags.rs | |||
@@ -56,6 +56,7 @@ impl Default for FeatureFlags { | |||
56 | ("completion.insertion.add-call-parenthesis", true), | 56 | ("completion.insertion.add-call-parenthesis", true), |
57 | ("completion.enable-postfix", true), | 57 | ("completion.enable-postfix", true), |
58 | ("notifications.workspace-loaded", true), | 58 | ("notifications.workspace-loaded", true), |
59 | ("notifications.cargo-toml-not-found", true), | ||
59 | ]) | 60 | ]) |
60 | } | 61 | } |
61 | } | 62 | } |
diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index 047c86a3b..7a49cad86 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs | |||
@@ -62,6 +62,22 @@ pub fn main_loop( | |||
62 | 62 | ||
63 | let mut loop_state = LoopState::default(); | 63 | let mut loop_state = LoopState::default(); |
64 | let mut world_state = { | 64 | let mut world_state = { |
65 | let feature_flags = { | ||
66 | let mut ff = FeatureFlags::default(); | ||
67 | for (flag, value) in config.feature_flags { | ||
68 | if ff.set(flag.as_str(), value).is_err() { | ||
69 | log::error!("unknown feature flag: {:?}", flag); | ||
70 | show_message( | ||
71 | req::MessageType::Error, | ||
72 | format!("unknown feature flag: {:?}", flag), | ||
73 | &connection.sender, | ||
74 | ); | ||
75 | } | ||
76 | } | ||
77 | ff | ||
78 | }; | ||
79 | log::info!("feature_flags: {:#?}", feature_flags); | ||
80 | |||
65 | // FIXME: support dynamic workspace loading. | 81 | // FIXME: support dynamic workspace loading. |
66 | let workspaces = { | 82 | let workspaces = { |
67 | let mut loaded_workspaces = Vec::new(); | 83 | let mut loaded_workspaces = Vec::new(); |
@@ -75,7 +91,12 @@ pub fn main_loop( | |||
75 | Ok(workspace) => loaded_workspaces.push(workspace), | 91 | Ok(workspace) => loaded_workspaces.push(workspace), |
76 | Err(e) => { | 92 | Err(e) => { |
77 | log::error!("loading workspace failed: {}", e); | 93 | log::error!("loading workspace failed: {}", e); |
78 | 94 | if let Some(ra_project_model::CargoTomlNotFoundError(_)) = e.downcast_ref() | |
95 | { | ||
96 | if !feature_flags.get("notifications.cargo-toml-not-found") { | ||
97 | continue; | ||
98 | } | ||
99 | } | ||
79 | show_message( | 100 | show_message( |
80 | req::MessageType::Error, | 101 | req::MessageType::Error, |
81 | format!("rust-analyzer failed to load workspace: {}", e), | 102 | format!("rust-analyzer failed to load workspace: {}", e), |
@@ -136,22 +157,6 @@ pub fn main_loop( | |||
136 | } | 157 | } |
137 | }; | 158 | }; |
138 | 159 | ||
139 | let feature_flags = { | ||
140 | let mut ff = FeatureFlags::default(); | ||
141 | for (flag, value) in config.feature_flags { | ||
142 | if ff.set(flag.as_str(), value).is_err() { | ||
143 | log::error!("unknown feature flag: {:?}", flag); | ||
144 | show_message( | ||
145 | req::MessageType::Error, | ||
146 | format!("unknown feature flag: {:?}", flag), | ||
147 | &connection.sender, | ||
148 | ); | ||
149 | } | ||
150 | } | ||
151 | ff | ||
152 | }; | ||
153 | log::info!("feature_flags: {:#?}", feature_flags); | ||
154 | |||
155 | WorldState::new( | 160 | WorldState::new( |
156 | ws_roots, | 161 | ws_roots, |
157 | workspaces, | 162 | workspaces, |
diff --git a/crates/ra_project_model/src/lib.rs b/crates/ra_project_model/src/lib.rs index d71b7031a..b7f6a9b57 100644 --- a/crates/ra_project_model/src/lib.rs +++ b/crates/ra_project_model/src/lib.rs | |||
@@ -23,9 +23,19 @@ pub use crate::{ | |||
23 | sysroot::Sysroot, | 23 | sysroot::Sysroot, |
24 | }; | 24 | }; |
25 | 25 | ||
26 | // FIXME use proper error enum | ||
27 | pub type Result<T> = ::std::result::Result<T, Box<dyn Error + Send + Sync>>; | 26 | pub type Result<T> = ::std::result::Result<T, Box<dyn Error + Send + Sync>>; |
28 | 27 | ||
28 | #[derive(Clone, PartialEq, Eq, Hash, Debug)] | ||
29 | pub struct CargoTomlNotFoundError(pub PathBuf); | ||
30 | |||
31 | impl std::fmt::Display for CargoTomlNotFoundError { | ||
32 | fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { | ||
33 | write!(fmt, "can't find Cargo.toml at {}", self.0.display()) | ||
34 | } | ||
35 | } | ||
36 | |||
37 | impl Error for CargoTomlNotFoundError {} | ||
38 | |||
29 | #[derive(Debug, Clone)] | 39 | #[derive(Debug, Clone)] |
30 | pub enum ProjectWorkspace { | 40 | pub enum ProjectWorkspace { |
31 | /// Project workspace was discovered by running `cargo metadata` and `rustc --print sysroot`. | 41 | /// Project workspace was discovered by running `cargo metadata` and `rustc --print sysroot`. |
@@ -362,7 +372,7 @@ fn find_cargo_toml(path: &Path) -> Result<PathBuf> { | |||
362 | } | 372 | } |
363 | curr = path.parent(); | 373 | curr = path.parent(); |
364 | } | 374 | } |
365 | Err(format!("can't find Cargo.toml at {}", path.display()))? | 375 | Err(CargoTomlNotFoundError(path.to_path_buf()))? |
366 | } | 376 | } |
367 | 377 | ||
368 | pub fn get_rustc_cfg_options() -> CfgOptions { | 378 | pub fn get_rustc_cfg_options() -> CfgOptions { |
diff --git a/docs/user/README.md b/docs/user/README.md index 282445722..fa202f06c 100644 --- a/docs/user/README.md +++ b/docs/user/README.md | |||
@@ -122,6 +122,8 @@ host. | |||
122 | "completion.enable-postfix": true, | 122 | "completion.enable-postfix": true, |
123 | // Show notification when workspace is fully loaded | 123 | // Show notification when workspace is fully loaded |
124 | "notifications.workspace-loaded": true, | 124 | "notifications.workspace-loaded": true, |
125 | // Show error when no Cargo.toml was found | ||
126 | "notifications.cargo-toml-not-found": true, | ||
125 | } | 127 | } |
126 | ``` | 128 | ``` |
127 | 129 | ||