diff options
-rw-r--r-- | crates/rust-analyzer/src/bin/args.rs | 312 | ||||
-rw-r--r-- | crates/rust-analyzer/src/bin/main.rs | 4 | ||||
-rw-r--r-- | crates/rust-analyzer/src/cli/diagnostics.rs | 7 |
3 files changed, 99 insertions, 224 deletions
diff --git a/crates/rust-analyzer/src/bin/args.rs b/crates/rust-analyzer/src/bin/args.rs index 45dc62ea7..b724ae454 100644 --- a/crates/rust-analyzer/src/bin/args.rs +++ b/crates/rust-analyzer/src/bin/args.rs | |||
@@ -18,36 +18,93 @@ pub(crate) struct Args { | |||
18 | } | 18 | } |
19 | 19 | ||
20 | pub(crate) enum Command { | 20 | pub(crate) enum Command { |
21 | Parse { | 21 | Parse { no_dump: bool }, |
22 | no_dump: bool, | ||
23 | }, | ||
24 | Symbols, | 22 | Symbols, |
25 | Highlight { | 23 | Highlight { rainbow: bool }, |
26 | rainbow: bool, | ||
27 | }, | ||
28 | AnalysisStats(AnalysisStatsCmd), | 24 | AnalysisStats(AnalysisStatsCmd), |
29 | Bench(BenchCmd), | 25 | Bench(BenchCmd), |
30 | Diagnostics { | 26 | Diagnostics { path: PathBuf, load_output_dirs: bool, with_proc_macro: bool }, |
31 | path: PathBuf, | 27 | Ssr { rules: Vec<SsrRule> }, |
32 | load_output_dirs: bool, | 28 | StructuredSearch { debug_snippet: Option<String>, patterns: Vec<SsrPattern> }, |
33 | with_proc_macro: bool, | ||
34 | /// Include files which are not modules. In rust-analyzer | ||
35 | /// this would include the parser test files. | ||
36 | all: bool, | ||
37 | }, | ||
38 | Ssr { | ||
39 | rules: Vec<SsrRule>, | ||
40 | }, | ||
41 | StructuredSearch { | ||
42 | debug_snippet: Option<String>, | ||
43 | patterns: Vec<SsrPattern>, | ||
44 | }, | ||
45 | ProcMacro, | 29 | ProcMacro, |
46 | RunServer, | 30 | RunServer, |
47 | Version, | 31 | Version, |
48 | Help, | 32 | Help, |
49 | } | 33 | } |
50 | 34 | ||
35 | const HELP: &str = "\ | ||
36 | rust-analyzer | ||
37 | |||
38 | USAGE: | ||
39 | rust-analyzer [FLAGS] [COMMAND] [COMMAND_OPTIONS] | ||
40 | |||
41 | FLAGS: | ||
42 | --version Print version | ||
43 | -h, --help Print this help | ||
44 | |||
45 | -v, --verbose | ||
46 | -vv, --spammy | ||
47 | -q, --quiet Set verbosity | ||
48 | |||
49 | --log-file <PATH> Log to the specified filed instead of stderr | ||
50 | |||
51 | ENVIRONMENTAL VARIABLES: | ||
52 | RA_LOG Set log filter in env_logger format | ||
53 | RA_PROFILE Enable hierarchical profiler | ||
54 | |||
55 | COMMANDS: | ||
56 | |||
57 | not specified Launch LSP server | ||
58 | |||
59 | parse < main.rs Parse tree | ||
60 | --no-dump Suppress printing | ||
61 | |||
62 | symbols < main.rs Parse input an print the list of symbols | ||
63 | |||
64 | highlight < main.rs Highlight input as html | ||
65 | --rainbow Enable rainbow highlighting of identifiers | ||
66 | |||
67 | analysis-stats <PATH> Batch typecheck project and print summary statistics | ||
68 | <PATH> Directory with Cargo.toml | ||
69 | --randomize Randomize order in which crates, modules, and items are processed | ||
70 | --parallel Run type inference in parallel | ||
71 | --memory-usage Collect memory usage statistics | ||
72 | -o, --only <PATH> Only analyze items matching this path | ||
73 | --with-deps Also analyze all dependencies | ||
74 | --load-output-dirs | ||
75 | Load OUT_DIR values by running `cargo check` before analysis | ||
76 | --with-proc-macro Use proc-macro-srv for proc-macro expanding | ||
77 | |||
78 | analysis-bench <PATH> Benchmark specific analysis operation | ||
79 | <PATH> Directory with Cargo.toml | ||
80 | --highlight <PATH> | ||
81 | Compute syntax highlighting for this file | ||
82 | --complete <PATH:LINE:COLUMN> | ||
83 | Compute completions at this location | ||
84 | --goto-def <PATH:LINE:COLUMN> | ||
85 | Compute goto definition at this location | ||
86 | --memory-usage Collect memory usage statistics | ||
87 | --load-output-dirs | ||
88 | Load OUT_DIR values by running `cargo check` before analysis | ||
89 | --with-proc-macro Use proc-macro-srv for proc-macro expanding | ||
90 | |||
91 | diagnostics <PATH> | ||
92 | <PATH> Directory with Cargo.toml | ||
93 | --load-output-dirs | ||
94 | Load OUT_DIR values by running `cargo check` before analysis | ||
95 | --with-proc-macro Use proc-macro-srv for proc-macro expanding | ||
96 | |||
97 | ssr [RULE...] | ||
98 | <RULE> A structured search replace rule (`$a.foo($b) ==> bar($a, $b)`) | ||
99 | --debug <snippet> Prints debug information for any nodes with source exactly | ||
100 | equal to <snippet> | ||
101 | |||
102 | search [PATTERN..] | ||
103 | <PATTERN> A structured search replace pattern (`$a.foo($b)`) | ||
104 | --debug <snippet> Prints debug information for any nodes with source exactly | ||
105 | equal to <snippet> | ||
106 | "; | ||
107 | |||
51 | impl Args { | 108 | impl Args { |
52 | pub(crate) fn parse() -> Result<Args> { | 109 | pub(crate) fn parse() -> Result<Args> { |
53 | let mut matches = Arguments::from_env(); | 110 | let mut matches = Arguments::from_env(); |
@@ -75,108 +132,34 @@ impl Args { | |||
75 | }; | 132 | }; |
76 | let log_file = matches.opt_value_from_str("--log-file")?; | 133 | let log_file = matches.opt_value_from_str("--log-file")?; |
77 | 134 | ||
78 | let help = Ok(Args { verbosity, log_file: None, command: Command::Help }); | 135 | if matches.contains(["-h", "--help"]) { |
136 | eprintln!("{}", HELP); | ||
137 | return Ok(Args { verbosity, log_file: None, command: Command::Help }); | ||
138 | } | ||
139 | |||
79 | let subcommand = match matches.subcommand()? { | 140 | let subcommand = match matches.subcommand()? { |
80 | Some(it) => it, | 141 | Some(it) => it, |
81 | None => { | 142 | None => { |
82 | if matches.contains(["-h", "--help"]) { | ||
83 | print_subcommands(); | ||
84 | return help; | ||
85 | } | ||
86 | matches.finish().or_else(handle_extra_flags)?; | 143 | matches.finish().or_else(handle_extra_flags)?; |
87 | return Ok(Args { verbosity, log_file, command: Command::RunServer }); | 144 | return Ok(Args { verbosity, log_file, command: Command::RunServer }); |
88 | } | 145 | } |
89 | }; | 146 | }; |
90 | let command = match subcommand.as_str() { | 147 | let command = match subcommand.as_str() { |
91 | "parse" => { | 148 | "parse" => { |
92 | if matches.contains(["-h", "--help"]) { | ||
93 | eprintln!( | ||
94 | "\ | ||
95 | rust-analyzer parse | ||
96 | |||
97 | USAGE: | ||
98 | rust-analyzer parse [FLAGS] | ||
99 | |||
100 | FLAGS: | ||
101 | -h, --help Prints help information | ||
102 | --no-dump" | ||
103 | ); | ||
104 | return help; | ||
105 | } | ||
106 | |||
107 | let no_dump = matches.contains("--no-dump"); | 149 | let no_dump = matches.contains("--no-dump"); |
108 | matches.finish().or_else(handle_extra_flags)?; | 150 | matches.finish().or_else(handle_extra_flags)?; |
109 | Command::Parse { no_dump } | 151 | Command::Parse { no_dump } |
110 | } | 152 | } |
111 | "symbols" => { | 153 | "symbols" => { |
112 | if matches.contains(["-h", "--help"]) { | ||
113 | eprintln!( | ||
114 | "\ | ||
115 | rust-analyzer symbols | ||
116 | |||
117 | USAGE: | ||
118 | rust-analyzer highlight [FLAGS] | ||
119 | |||
120 | FLAGS: | ||
121 | -h, --help Prints help inforamtion" | ||
122 | ); | ||
123 | return help; | ||
124 | } | ||
125 | |||
126 | matches.finish().or_else(handle_extra_flags)?; | 154 | matches.finish().or_else(handle_extra_flags)?; |
127 | |||
128 | Command::Symbols | 155 | Command::Symbols |
129 | } | 156 | } |
130 | "highlight" => { | 157 | "highlight" => { |
131 | if matches.contains(["-h", "--help"]) { | 158 | let rainbow = matches.contains("--rainbow"); |
132 | eprintln!( | ||
133 | "\ | ||
134 | rust-analyzer highlight | ||
135 | |||
136 | USAGE: | ||
137 | rust-analyzer highlight [FLAGS] | ||
138 | |||
139 | FLAGS: | ||
140 | -h, --help Prints help information | ||
141 | -r, --rainbow" | ||
142 | ); | ||
143 | return help; | ||
144 | } | ||
145 | |||
146 | let rainbow = matches.contains(["-r", "--rainbow"]); | ||
147 | matches.finish().or_else(handle_extra_flags)?; | 159 | matches.finish().or_else(handle_extra_flags)?; |
148 | Command::Highlight { rainbow } | 160 | Command::Highlight { rainbow } |
149 | } | 161 | } |
150 | "analysis-stats" => { | 162 | "analysis-stats" => { |
151 | if matches.contains(["-h", "--help"]) { | ||
152 | eprintln!( | ||
153 | "\ | ||
154 | rust-analyzer analysis-stats | ||
155 | |||
156 | USAGE: | ||
157 | rust-analyzer analysis-stats [FLAGS] [OPTIONS] [PATH] | ||
158 | |||
159 | FLAGS: | ||
160 | -o, --only Only analyze items matching this path | ||
161 | -h, --help Prints help information | ||
162 | --memory-usage Collect memory usage statistics | ||
163 | --randomize Randomize order in which crates, modules, and items are processed | ||
164 | --parallel Run type inference in parallel | ||
165 | --load-output-dirs Load OUT_DIR values by running `cargo check` before analysis | ||
166 | --with-proc-macro Use ra-proc-macro-srv for proc-macro expanding | ||
167 | --with-deps Also analyze all dependencies | ||
168 | -v, --verbose | ||
169 | -q, --quiet | ||
170 | |||
171 | OPTIONS: | ||
172 | -o <ONLY> | ||
173 | |||
174 | ARGS: | ||
175 | <PATH>" | ||
176 | ); | ||
177 | return help; | ||
178 | } | ||
179 | |||
180 | let randomize = matches.contains("--randomize"); | 163 | let randomize = matches.contains("--randomize"); |
181 | let parallel = matches.contains("--parallel"); | 164 | let parallel = matches.contains("--parallel"); |
182 | let memory_usage = matches.contains("--memory-usage"); | 165 | let memory_usage = matches.contains("--memory-usage"); |
@@ -204,34 +187,6 @@ ARGS: | |||
204 | }) | 187 | }) |
205 | } | 188 | } |
206 | "analysis-bench" => { | 189 | "analysis-bench" => { |
207 | if matches.contains(["-h", "--help"]) { | ||
208 | eprintln!( | ||
209 | "\ | ||
210 | rust-analyzer analysis-bench | ||
211 | |||
212 | USAGE: | ||
213 | rust-analyzer analysis-bench [FLAGS] [OPTIONS] | ||
214 | |||
215 | FLAGS: | ||
216 | -h, --help Prints help information | ||
217 | --memory-usage Collect memory usage statistics | ||
218 | --load-output-dirs Load OUT_DIR values by running `cargo check` before analysis | ||
219 | --with-proc-macro Use ra-proc-macro-srv for proc-macro expanding | ||
220 | -v, --verbose | ||
221 | |||
222 | OPTIONS: | ||
223 | --project <PATH> Path to directory with Cargo.toml | ||
224 | --complete <PATH:LINE:COLUMN> Compute completions at this location | ||
225 | --goto-def <PATH:LINE:COLUMN> Compute goto definition at this location | ||
226 | --highlight <PATH> Hightlight this file | ||
227 | |||
228 | ARGS: | ||
229 | <PATH> Project to analyse" | ||
230 | ); | ||
231 | return help; | ||
232 | } | ||
233 | |||
234 | let path: PathBuf = matches.opt_value_from_str("--project")?.unwrap_or_default(); | ||
235 | let highlight_path: Option<String> = matches.opt_value_from_str("--highlight")?; | 190 | let highlight_path: Option<String> = matches.opt_value_from_str("--highlight")?; |
236 | let complete_path: Option<Position> = matches.opt_value_from_str("--complete")?; | 191 | let complete_path: Option<Position> = matches.opt_value_from_str("--complete")?; |
237 | let goto_def_path: Option<Position> = matches.opt_value_from_str("--goto-def")?; | 192 | let goto_def_path: Option<Position> = matches.opt_value_from_str("--goto-def")?; |
@@ -249,6 +204,15 @@ ARGS: | |||
249 | let memory_usage = matches.contains("--memory-usage"); | 204 | let memory_usage = matches.contains("--memory-usage"); |
250 | let load_output_dirs = matches.contains("--load-output-dirs"); | 205 | let load_output_dirs = matches.contains("--load-output-dirs"); |
251 | let with_proc_macro = matches.contains("--with-proc-macro"); | 206 | let with_proc_macro = matches.contains("--with-proc-macro"); |
207 | |||
208 | let path = { | ||
209 | let mut trailing = matches.free()?; | ||
210 | if trailing.len() != 1 { | ||
211 | bail!("Invalid flags"); | ||
212 | } | ||
213 | trailing.pop().unwrap().into() | ||
214 | }; | ||
215 | |||
252 | Command::Bench(BenchCmd { | 216 | Command::Bench(BenchCmd { |
253 | memory_usage, | 217 | memory_usage, |
254 | path, | 218 | path, |
@@ -258,28 +222,8 @@ ARGS: | |||
258 | }) | 222 | }) |
259 | } | 223 | } |
260 | "diagnostics" => { | 224 | "diagnostics" => { |
261 | if matches.contains(["-h", "--help"]) { | ||
262 | eprintln!( | ||
263 | "\ | ||
264 | rust-analyzer diagnostics | ||
265 | |||
266 | USAGE: | ||
267 | rust-analyzer diagnostics [FLAGS] [PATH] | ||
268 | |||
269 | FLAGS: | ||
270 | -h, --help Prints help information | ||
271 | --load-output-dirs Load OUT_DIR values by running `cargo check` before analysis | ||
272 | --all Include all files rather than only modules | ||
273 | |||
274 | ARGS: | ||
275 | <PATH>" | ||
276 | ); | ||
277 | return help; | ||
278 | } | ||
279 | |||
280 | let load_output_dirs = matches.contains("--load-output-dirs"); | 225 | let load_output_dirs = matches.contains("--load-output-dirs"); |
281 | let with_proc_macro = matches.contains("--with-proc-macro"); | 226 | let with_proc_macro = matches.contains("--with-proc-macro"); |
282 | let all = matches.contains("--all"); | ||
283 | let path = { | 227 | let path = { |
284 | let mut trailing = matches.free()?; | 228 | let mut trailing = matches.free()?; |
285 | if trailing.len() != 1 { | 229 | if trailing.len() != 1 { |
@@ -288,30 +232,10 @@ ARGS: | |||
288 | trailing.pop().unwrap().into() | 232 | trailing.pop().unwrap().into() |
289 | }; | 233 | }; |
290 | 234 | ||
291 | Command::Diagnostics { path, load_output_dirs, with_proc_macro, all } | 235 | Command::Diagnostics { path, load_output_dirs, with_proc_macro } |
292 | } | 236 | } |
293 | "proc-macro" => Command::ProcMacro, | 237 | "proc-macro" => Command::ProcMacro, |
294 | "ssr" => { | 238 | "ssr" => { |
295 | if matches.contains(["-h", "--help"]) { | ||
296 | eprintln!( | ||
297 | "\ | ||
298 | rust-analyzer ssr | ||
299 | |||
300 | USAGE: | ||
301 | rust-analyzer ssr [FLAGS] [RULE...] | ||
302 | |||
303 | EXAMPLE: | ||
304 | rust-analyzer ssr '$a.foo($b) ==> bar($a, $b)' | ||
305 | |||
306 | FLAGS: | ||
307 | --debug <snippet> Prints debug information for any nodes with source exactly equal to <snippet> | ||
308 | -h, --help Prints help information | ||
309 | |||
310 | ARGS: | ||
311 | <RULE> A structured search replace rule" | ||
312 | ); | ||
313 | return help; | ||
314 | } | ||
315 | let mut rules = Vec::new(); | 239 | let mut rules = Vec::new(); |
316 | while let Some(rule) = matches.free_from_str()? { | 240 | while let Some(rule) = matches.free_from_str()? { |
317 | rules.push(rule); | 241 | rules.push(rule); |
@@ -319,26 +243,6 @@ ARGS: | |||
319 | Command::Ssr { rules } | 243 | Command::Ssr { rules } |
320 | } | 244 | } |
321 | "search" => { | 245 | "search" => { |
322 | if matches.contains(["-h", "--help"]) { | ||
323 | eprintln!( | ||
324 | "\ | ||
325 | rust-analyzer search | ||
326 | |||
327 | USAGE: | ||
328 | rust-analyzer search [FLAGS] [PATTERN...] | ||
329 | |||
330 | EXAMPLE: | ||
331 | rust-analyzer search '$a.foo($b)' | ||
332 | |||
333 | FLAGS: | ||
334 | --debug <snippet> Prints debug information for any nodes with source exactly equal to <snippet> | ||
335 | -h, --help Prints help information | ||
336 | |||
337 | ARGS: | ||
338 | <PATTERN> A structured search pattern" | ||
339 | ); | ||
340 | return help; | ||
341 | } | ||
342 | let debug_snippet = matches.opt_value_from_str("--debug")?; | 246 | let debug_snippet = matches.opt_value_from_str("--debug")?; |
343 | let mut patterns = Vec::new(); | 247 | let mut patterns = Vec::new(); |
344 | while let Some(rule) = matches.free_from_str()? { | 248 | while let Some(rule) = matches.free_from_str()? { |
@@ -347,38 +251,14 @@ ARGS: | |||
347 | Command::StructuredSearch { patterns, debug_snippet } | 251 | Command::StructuredSearch { patterns, debug_snippet } |
348 | } | 252 | } |
349 | _ => { | 253 | _ => { |
350 | print_subcommands(); | 254 | eprintln!("{}", HELP); |
351 | return help; | 255 | return Ok(Args { verbosity, log_file: None, command: Command::Help }); |
352 | } | 256 | } |
353 | }; | 257 | }; |
354 | Ok(Args { verbosity, log_file, command }) | 258 | Ok(Args { verbosity, log_file, command }) |
355 | } | 259 | } |
356 | } | 260 | } |
357 | 261 | ||
358 | fn print_subcommands() { | ||
359 | eprintln!( | ||
360 | "\ | ||
361 | rust-analyzer | ||
362 | |||
363 | USAGE: | ||
364 | rust-analyzer <SUBCOMMAND> | ||
365 | |||
366 | FLAGS: | ||
367 | -h, --help Prints help information | ||
368 | |||
369 | SUBCOMMANDS: | ||
370 | analysis-bench | ||
371 | analysis-stats | ||
372 | highlight | ||
373 | diagnostics | ||
374 | proc-macro | ||
375 | parse | ||
376 | search | ||
377 | ssr | ||
378 | symbols" | ||
379 | ) | ||
380 | } | ||
381 | |||
382 | fn handle_extra_flags(e: pico_args::Error) -> Result<()> { | 262 | fn handle_extra_flags(e: pico_args::Error) -> Result<()> { |
383 | if let pico_args::Error::UnusedArgsLeft(flags) = e { | 263 | if let pico_args::Error::UnusedArgsLeft(flags) = e { |
384 | let mut invalid_flags = String::new(); | 264 | let mut invalid_flags = String::new(); |
diff --git a/crates/rust-analyzer/src/bin/main.rs b/crates/rust-analyzer/src/bin/main.rs index 266768970..ba4402ade 100644 --- a/crates/rust-analyzer/src/bin/main.rs +++ b/crates/rust-analyzer/src/bin/main.rs | |||
@@ -38,8 +38,8 @@ fn try_main() -> Result<()> { | |||
38 | args::Command::Highlight { rainbow } => cli::highlight(rainbow)?, | 38 | args::Command::Highlight { rainbow } => cli::highlight(rainbow)?, |
39 | args::Command::AnalysisStats(cmd) => cmd.run(args.verbosity)?, | 39 | args::Command::AnalysisStats(cmd) => cmd.run(args.verbosity)?, |
40 | args::Command::Bench(cmd) => cmd.run(args.verbosity)?, | 40 | args::Command::Bench(cmd) => cmd.run(args.verbosity)?, |
41 | args::Command::Diagnostics { path, load_output_dirs, with_proc_macro, all } => { | 41 | args::Command::Diagnostics { path, load_output_dirs, with_proc_macro } => { |
42 | cli::diagnostics(path.as_ref(), load_output_dirs, with_proc_macro, all)? | 42 | cli::diagnostics(path.as_ref(), load_output_dirs, with_proc_macro)? |
43 | } | 43 | } |
44 | args::Command::Ssr { rules } => { | 44 | args::Command::Ssr { rules } => { |
45 | cli::apply_ssr_rules(rules)?; | 45 | cli::apply_ssr_rules(rules)?; |
diff --git a/crates/rust-analyzer/src/cli/diagnostics.rs b/crates/rust-analyzer/src/cli/diagnostics.rs index c424aa6e2..f3b6c900e 100644 --- a/crates/rust-analyzer/src/cli/diagnostics.rs +++ b/crates/rust-analyzer/src/cli/diagnostics.rs | |||
@@ -12,12 +12,7 @@ use ide::{DiagnosticsConfig, Severity}; | |||
12 | 12 | ||
13 | use crate::cli::{load_cargo::load_cargo, Result}; | 13 | use crate::cli::{load_cargo::load_cargo, Result}; |
14 | 14 | ||
15 | pub fn diagnostics( | 15 | pub fn diagnostics(path: &Path, load_output_dirs: bool, with_proc_macro: bool) -> Result<()> { |
16 | path: &Path, | ||
17 | load_output_dirs: bool, | ||
18 | with_proc_macro: bool, | ||
19 | _all: bool, | ||
20 | ) -> Result<()> { | ||
21 | let (host, _vfs) = load_cargo(path, load_output_dirs, with_proc_macro)?; | 16 | let (host, _vfs) = load_cargo(path, load_output_dirs, with_proc_macro)?; |
22 | let db = host.raw_database(); | 17 | let db = host.raw_database(); |
23 | let analysis = host.analysis(); | 18 | let analysis = host.analysis(); |