Skip to main content

ra_ap_rust_analyzer/cli/
flags.rs

1//! Grammar for the command-line arguments.
2#![allow(unreachable_pub)]
3use std::{path::PathBuf, str::FromStr};
4
5use ide_ssr::{SsrPattern, SsrRule};
6
7use crate::cli::Verbosity;
8
9xflags::xflags! {
10    src "./src/cli/flags.rs"
11
12    /// LSP server for the Rust programming language.
13    ///
14    /// Subcommands and their flags do not provide any stability guarantees and may be removed or
15    /// changed without notice. Top-level flags that are not marked as [Unstable] provide
16    /// backwards-compatibility and may be relied on.
17    cmd rust-analyzer {
18        /// Verbosity level, can be repeated multiple times.
19        repeated -v, --verbose
20        /// Verbosity level.
21        optional -q, --quiet
22
23        /// Log to the specified file instead of stderr.
24        optional --log-file path: PathBuf
25        /// Flush log records to the file immediately.
26        optional --no-log-buffering
27
28        /// [Unstable] Wait until a debugger is attached to (requires debug build).
29        optional --wait-dbg
30
31        default cmd lsp-server {
32            /// Print version.
33            optional -V, --version
34
35            /// Dump a LSP config JSON schema.
36            optional --print-config-schema
37        }
38
39        /// Parse stdin.
40        cmd parse {
41            /// Suppress printing.
42            optional --no-dump
43            /// Output as JSON.
44            optional --json
45        }
46
47        /// Parse stdin and print the list of symbols.
48        cmd symbols {}
49
50        /// Highlight stdin as html.
51        cmd highlight {
52            /// Enable rainbow highlighting of identifiers.
53            optional --rainbow
54        }
55
56        /// Batch typecheck project and print summary statistics
57        cmd analysis-stats {
58            /// Directory with Cargo.toml or rust-project.json.
59            required path: PathBuf
60
61            optional --output format: OutputFormat
62
63            /// Randomize order in which crates, modules, and items are processed.
64            optional --randomize
65            /// Run type inference in parallel.
66            optional --parallel
67
68            /// Only analyze items matching this path.
69            optional -o, --only path: String
70            /// Also analyze all dependencies.
71            optional --with-deps
72            /// Don't load sysroot crates (`std`, `core` & friends).
73            optional --no-sysroot
74            /// Don't set #[cfg(test)].
75            optional --no-test
76
77            /// Don't run build scripts or load `OUT_DIR` values by running `cargo check` before analysis.
78            optional --disable-build-scripts
79            /// Don't expand proc macros.
80            optional --disable-proc-macros
81            /// Run the proc-macro-srv binary at the specified path.
82            optional --proc-macro-srv path: PathBuf
83            /// Skip lang items fetching.
84            optional --skip-lang-items
85            /// Skip body lowering.
86            optional --skip-lowering
87            /// Skip type inference.
88            optional --skip-inference
89            /// Skip lowering to mir
90            optional --skip-mir-stats
91            /// Skip data layout calculation
92            optional --skip-data-layout
93            /// Skip const evaluation
94            optional --skip-const-eval
95            /// Runs several IDE features after analysis, including semantics highlighting, diagnostics
96            /// and annotations. This is useful for benchmarking the memory usage on a project that has
97            /// been worked on for a bit in a longer running session.
98            optional --run-all-ide-things
99            /// Run term search on all the tail expressions (of functions, block, if statements etc.)
100            optional --run-term-search
101            /// Validate term search by running `cargo check` on every response.
102            /// Note that this also temporarily modifies the files on disk, use with caution!
103            optional --validate-term-search
104        }
105
106        /// Run unit tests of the project using mir interpreter
107        cmd run-tests {
108            /// Directory with Cargo.toml or rust-project.json.
109            required path: PathBuf
110        }
111
112        /// Run unit tests of the project using mir interpreter
113        cmd rustc-tests {
114            /// Directory with Cargo.toml.
115            required rustc_repo: PathBuf
116
117            /// Only run tests with filter as substring
118            optional --filter path: String
119        }
120
121        cmd diagnostics {
122            /// Directory with Cargo.toml or rust-project.json.
123            required path: PathBuf
124
125            /// Don't run build scripts or load `OUT_DIR` values by running `cargo check` before analysis.
126            optional --disable-build-scripts
127            /// Don't expand proc macros.
128            optional --disable-proc-macros
129            /// Run the proc-macro-srv binary at the specified path.
130            optional --proc-macro-srv path: PathBuf
131
132            /// The minimum severity.
133            optional --severity severity: Severity
134        }
135
136        /// Report unresolved references
137        cmd unresolved-references {
138            /// Directory with Cargo.toml or rust-project.json.
139            required path: PathBuf
140
141            /// Don't run build scripts or load `OUT_DIR` values by running `cargo check` before analysis.
142            optional --disable-build-scripts
143            /// Don't expand proc macros.
144            optional --disable-proc-macros
145            /// Run the proc-macro-srv binary at the specified path.
146            optional --proc-macro-srv path: PathBuf
147        }
148
149        /// Prime caches, as rust-analyzer does typically at startup in interactive sessions.
150        cmd prime-caches {
151            /// Directory with Cargo.toml or rust-project.json.
152            required path: PathBuf
153
154            /// Don't run build scripts or load `OUT_DIR` values by running `cargo check` before analysis.
155            optional --disable-build-scripts
156            /// Don't expand proc macros.
157            optional --disable-proc-macros
158            /// Run the proc-macro-srv binary at the specified path.
159            optional --proc-macro-srv path: PathBuf
160            /// The number of threads to use. Defaults to the number of physical cores.
161            optional --num-threads num_threads: usize
162        }
163
164        cmd ssr {
165            /// A structured search replace rule (`$a.foo($b) ==>> bar($a, $b)`)
166            repeated rule: SsrRule
167        }
168
169        cmd search {
170            /// A structured search replace pattern (`$a.foo($b)`)
171            repeated pattern: SsrPattern
172            /// Prints debug information for any nodes with source exactly equal to snippet.
173            optional --debug snippet: String
174        }
175
176        cmd lsif {
177            required path: PathBuf
178
179            /// Exclude code from vendored libraries from the resulting index.
180            optional --exclude-vendored-libraries
181        }
182
183        cmd scip {
184            required path: PathBuf
185
186            /// The output path where the SCIP file will be written to. Defaults to `index.scip`.
187            optional --output path: PathBuf
188
189            /// A path to an json configuration file that can be used to customize cargo behavior.
190            optional --config-path config_path: PathBuf
191
192            /// Exclude code from vendored libraries from the resulting index.
193            optional --exclude-vendored-libraries
194        }
195    }
196}
197
198// generated start
199// The following code is generated by `xflags` macro.
200// Run `env UPDATE_XFLAGS=1 cargo build` to regenerate.
201#[derive(Debug)]
202pub struct RustAnalyzer {
203    pub verbose: u32,
204    pub quiet: bool,
205    pub log_file: Option<PathBuf>,
206    pub no_log_buffering: bool,
207    pub wait_dbg: bool,
208    pub subcommand: RustAnalyzerCmd,
209}
210
211#[derive(Debug)]
212pub enum RustAnalyzerCmd {
213    LspServer(LspServer),
214    Parse(Parse),
215    Symbols(Symbols),
216    Highlight(Highlight),
217    AnalysisStats(AnalysisStats),
218    RunTests(RunTests),
219    RustcTests(RustcTests),
220    Diagnostics(Diagnostics),
221    UnresolvedReferences(UnresolvedReferences),
222    PrimeCaches(PrimeCaches),
223    Ssr(Ssr),
224    Search(Search),
225    Lsif(Lsif),
226    Scip(Scip),
227}
228
229#[derive(Debug)]
230pub struct LspServer {
231    pub version: bool,
232    pub print_config_schema: bool,
233}
234
235#[derive(Debug)]
236pub struct Parse {
237    pub no_dump: bool,
238    pub json: bool,
239}
240
241#[derive(Debug)]
242pub struct Symbols;
243
244#[derive(Debug)]
245pub struct Highlight {
246    pub rainbow: bool,
247}
248
249#[derive(Debug)]
250pub struct AnalysisStats {
251    pub path: PathBuf,
252
253    pub output: Option<OutputFormat>,
254    pub randomize: bool,
255    pub parallel: bool,
256    pub only: Option<String>,
257    pub with_deps: bool,
258    pub no_sysroot: bool,
259    pub no_test: bool,
260    pub disable_build_scripts: bool,
261    pub disable_proc_macros: bool,
262    pub proc_macro_srv: Option<PathBuf>,
263    pub skip_lang_items: bool,
264    pub skip_lowering: bool,
265    pub skip_inference: bool,
266    pub skip_mir_stats: bool,
267    pub skip_data_layout: bool,
268    pub skip_const_eval: bool,
269    pub run_all_ide_things: bool,
270    pub run_term_search: bool,
271    pub validate_term_search: bool,
272}
273
274#[derive(Debug)]
275pub struct RunTests {
276    pub path: PathBuf,
277}
278
279#[derive(Debug)]
280pub struct RustcTests {
281    pub rustc_repo: PathBuf,
282
283    pub filter: Option<String>,
284}
285
286#[derive(Debug)]
287pub struct Diagnostics {
288    pub path: PathBuf,
289
290    pub disable_build_scripts: bool,
291    pub disable_proc_macros: bool,
292    pub proc_macro_srv: Option<PathBuf>,
293    pub severity: Option<Severity>,
294}
295
296#[derive(Debug)]
297pub struct UnresolvedReferences {
298    pub path: PathBuf,
299
300    pub disable_build_scripts: bool,
301    pub disable_proc_macros: bool,
302    pub proc_macro_srv: Option<PathBuf>,
303}
304
305#[derive(Debug)]
306pub struct PrimeCaches {
307    pub path: PathBuf,
308
309    pub disable_build_scripts: bool,
310    pub disable_proc_macros: bool,
311    pub proc_macro_srv: Option<PathBuf>,
312    pub num_threads: Option<usize>,
313}
314
315#[derive(Debug)]
316pub struct Ssr {
317    pub rule: Vec<SsrRule>,
318}
319
320#[derive(Debug)]
321pub struct Search {
322    pub pattern: Vec<SsrPattern>,
323
324    pub debug: Option<String>,
325}
326
327#[derive(Debug)]
328pub struct Lsif {
329    pub path: PathBuf,
330
331    pub exclude_vendored_libraries: bool,
332}
333
334#[derive(Debug)]
335pub struct Scip {
336    pub path: PathBuf,
337
338    pub output: Option<PathBuf>,
339    pub config_path: Option<PathBuf>,
340    pub exclude_vendored_libraries: bool,
341}
342
343impl RustAnalyzer {
344    #[allow(dead_code)]
345    pub fn from_env_or_exit() -> Self {
346        Self::from_env_or_exit_()
347    }
348
349    #[allow(dead_code)]
350    pub fn from_env() -> xflags::Result<Self> {
351        Self::from_env_()
352    }
353
354    #[allow(dead_code)]
355    pub fn from_vec(args: Vec<std::ffi::OsString>) -> xflags::Result<Self> {
356        Self::from_vec_(args)
357    }
358}
359// generated end
360
361#[derive(Debug, PartialEq, Eq)]
362pub enum OutputFormat {
363    Csv,
364}
365
366impl RustAnalyzer {
367    pub fn verbosity(&self) -> Verbosity {
368        if self.quiet {
369            return Verbosity::Quiet;
370        }
371        match self.verbose {
372            0 => Verbosity::Normal,
373            1 => Verbosity::Verbose,
374            _ => Verbosity::Spammy,
375        }
376    }
377}
378
379impl FromStr for OutputFormat {
380    type Err = String;
381
382    fn from_str(s: &str) -> Result<Self, Self::Err> {
383        match s {
384            "csv" => Ok(Self::Csv),
385            _ => Err(format!("unknown output format `{s}`")),
386        }
387    }
388}
389
390#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
391pub enum Severity {
392    Weak,
393    Warning,
394    Error,
395}
396
397impl FromStr for Severity {
398    type Err = String;
399
400    fn from_str(s: &str) -> Result<Self, Self::Err> {
401        match &*s.to_ascii_lowercase() {
402            "weak" => Ok(Self::Weak),
403            "warning" => Ok(Self::Warning),
404            "error" => Ok(Self::Error),
405            _ => Err(format!("unknown severity `{s}`")),
406        }
407    }
408}