diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-04-07 07:48:04 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2020-04-07 07:48:04 +0100 |
commit | 25596e1e1a579eb7643fda1d8013925342ea5a1e (patch) | |
tree | 141457681118671f58c055321b6a8f80f713224a | |
parent | c859a6480af7baece2eec38c19f71cb714db9e3b (diff) | |
parent | 8f7fceeb9ceab6383deae8895c88b3ba53f8dabe (diff) |
Merge #3872
3872: fix cargo check config with custom command r=matklad a=JoshMcguigan
fixes #3871
Previously if `get::<Vec<String>>(value, "/checkOnSave/overrideCommand")` returned `Some` we'd never execute `set(value, "/checkOnSave/command", command)`, even if the `overrideCommand` was empty.
I am not sure of the best way to prove this, but I believe the LSP clients send this config with a default value if it is not set by the user, which means `get::<Vec<String>>(value, "/checkOnSave/overrideCommand")` would return `Some(vec![])` and thus we'd never set the command to the user specified value (in the case of #3871, "clippy").
I have tested this fix manually by installing this modified version of rust-analyzer and verifying I can see clippy lints in my editor (`coc.nvim`) with `rust-analyzer.checkOnSave.command": "clippy"`.
As best I can tell this would have affected rustfmt extra args too, so this PR also applies the same fix there.
Co-authored-by: Josh Mcguigan <[email protected]>
-rw-r--r-- | crates/rust-analyzer/src/config.rs | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs index b6a015790..4734df16a 100644 --- a/crates/rust-analyzer/src/config.rs +++ b/crates/rust-analyzer/src/config.rs | |||
@@ -131,37 +131,47 @@ impl Config { | |||
131 | set(value, "/cargo/allFeatures", &mut self.cargo.all_features); | 131 | set(value, "/cargo/allFeatures", &mut self.cargo.all_features); |
132 | set(value, "/cargo/features", &mut self.cargo.features); | 132 | set(value, "/cargo/features", &mut self.cargo.features); |
133 | set(value, "/cargo/loadOutDirsFromCheck", &mut self.cargo.load_out_dirs_from_check); | 133 | set(value, "/cargo/loadOutDirsFromCheck", &mut self.cargo.load_out_dirs_from_check); |
134 | if let Some(mut args) = get::<Vec<String>>(value, "/rustfmt/overrideCommand") { | 134 | match get::<Vec<String>>(value, "/rustfmt/overrideCommand") { |
135 | if !args.is_empty() { | 135 | Some(mut args) if !args.is_empty() => { |
136 | let command = args.remove(0); | 136 | let command = args.remove(0); |
137 | self.rustfmt = RustfmtConfig::CustomCommand { | 137 | self.rustfmt = RustfmtConfig::CustomCommand { |
138 | command, | 138 | command, |
139 | args, | 139 | args, |
140 | } | 140 | } |
141 | } | 141 | } |
142 | } else if let RustfmtConfig::Rustfmt { extra_args } = &mut self.rustfmt { | 142 | _ => { |
143 | set(value, "/rustfmt/extraArgs", extra_args); | 143 | if let RustfmtConfig::Rustfmt { extra_args } = &mut self.rustfmt { |
144 | } | 144 | set(value, "/rustfmt/extraArgs", extra_args); |
145 | } | ||
146 | } | ||
147 | }; | ||
145 | 148 | ||
146 | if let Some(false) = get(value, "/checkOnSave/enable") { | 149 | if let Some(false) = get(value, "/checkOnSave/enable") { |
150 | // check is disabled | ||
147 | self.check = None; | 151 | self.check = None; |
148 | } else { | 152 | } else { |
149 | if let Some(mut args) = get::<Vec<String>>(value, "/checkOnSave/overrideCommand") { | 153 | // check is enabled |
150 | if !args.is_empty() { | 154 | match get::<Vec<String>>(value, "/checkOnSave/overrideCommand") { |
155 | // first see if the user has completely overridden the command | ||
156 | Some(mut args) if !args.is_empty() => { | ||
151 | let command = args.remove(0); | 157 | let command = args.remove(0); |
152 | self.check = Some(FlycheckConfig::CustomCommand { | 158 | self.check = Some(FlycheckConfig::CustomCommand { |
153 | command, | 159 | command, |
154 | args, | 160 | args, |
155 | }); | 161 | }); |
156 | } | 162 | } |
157 | 163 | // otherwise configure command customizations | |
158 | } else if let Some(FlycheckConfig::CargoCommand { command, extra_args, all_targets }) = &mut self.check | 164 | _ => { |
159 | { | 165 | if let Some(FlycheckConfig::CargoCommand { command, extra_args, all_targets }) |
160 | set(value, "/checkOnSave/extraArgs", extra_args); | 166 | = &mut self.check |
161 | set(value, "/checkOnSave/command", command); | 167 | { |
162 | set(value, "/checkOnSave/allTargets", all_targets); | 168 | set(value, "/checkOnSave/extraArgs", extra_args); |
163 | } | 169 | set(value, "/checkOnSave/command", command); |
164 | }; | 170 | set(value, "/checkOnSave/allTargets", all_targets); |
171 | } | ||
172 | } | ||
173 | }; | ||
174 | } | ||
165 | 175 | ||
166 | set(value, "/inlayHints/typeHints", &mut self.inlay_hints.type_hints); | 176 | set(value, "/inlayHints/typeHints", &mut self.inlay_hints.type_hints); |
167 | set(value, "/inlayHints/parameterHints", &mut self.inlay_hints.parameter_hints); | 177 | set(value, "/inlayHints/parameterHints", &mut self.inlay_hints.parameter_hints); |