| //! Grammar for the command-line arguments. |
| #![allow(unreachable_pub)] |
| use std::{path::PathBuf, str::FromStr}; |
| |
| use ide_ssr::{SsrPattern, SsrRule}; |
| |
| use crate::cli::Verbosity; |
| |
| xflags::xflags! { |
| src "./src/cli/flags.rs" |
| |
| /// LSP server for the Rust programming language. |
| /// |
| /// Subcommands and their flags do not provide any stability guarantees and may be removed or |
| /// changed without notice. Top-level flags that are not marked as [Unstable] provide |
| /// backwards-compatibility and may be relied on. |
| cmd rust-analyzer { |
| /// Verbosity level, can be repeated multiple times. |
| repeated -v, --verbose |
| /// Verbosity level. |
| optional -q, --quiet |
| |
| /// Log to the specified file instead of stderr. |
| optional --log-file path: PathBuf |
| /// Flush log records to the file immediately. |
| optional --no-log-buffering |
| |
| /// [Unstable] Wait until a debugger is attached to (requires debug build). |
| optional --wait-dbg |
| |
| default cmd lsp-server { |
| /// Print version. |
| optional -V, --version |
| |
| /// Dump a LSP config JSON schema. |
| optional --print-config-schema |
| } |
| |
| /// Parse stdin. |
| cmd parse { |
| /// Suppress printing. |
| optional --no-dump |
| } |
| |
| /// Parse stdin and print the list of symbols. |
| cmd symbols {} |
| |
| /// Highlight stdin as html. |
| cmd highlight { |
| /// Enable rainbow highlighting of identifiers. |
| optional --rainbow |
| } |
| |
| /// Batch typecheck project and print summary statistics |
| cmd analysis-stats { |
| /// Directory with Cargo.toml. |
| required path: PathBuf |
| |
| optional --output format: OutputFormat |
| |
| /// Randomize order in which crates, modules, and items are processed. |
| optional --randomize |
| /// Run type inference in parallel. |
| optional --parallel |
| /// Print the total length of all source and macro files (whitespace is not counted). |
| optional --source-stats |
| |
| /// Only analyze items matching this path. |
| optional -o, --only path: String |
| /// Also analyze all dependencies. |
| optional --with-deps |
| /// Don't load sysroot crates (`std`, `core` & friends). |
| optional --no-sysroot |
| |
| /// Don't run build scripts or load `OUT_DIR` values by running `cargo check` before analysis. |
| optional --disable-build-scripts |
| /// Don't use expand proc macros. |
| optional --disable-proc-macros |
| /// Skip body lowering. |
| optional --skip-lowering |
| /// Skip type inference. |
| optional --skip-inference |
| /// Skip lowering to mir |
| optional --skip-mir-stats |
| /// Skip data layout calculation |
| optional --skip-data-layout |
| /// Skip const evaluation |
| optional --skip-const-eval |
| /// Runs several IDE features after analysis, including semantics highlighting, diagnostics |
| /// and annotations. This is useful for benchmarking the memory usage on a project that has |
| /// been worked on for a bit in a longer running session. |
| optional --run-all-ide-things |
| /// Run term search on all the tail expressions (of functions, block, if statements etc.) |
| optional --run-term-search |
| /// Validate term search by running `cargo check` on every response. |
| /// Note that this also temporarily modifies the files on disk, use with caution! |
| optional --validate-term-search |
| } |
| |
| /// Run unit tests of the project using mir interpreter |
| cmd run-tests { |
| /// Directory with Cargo.toml. |
| required path: PathBuf |
| } |
| |
| /// Run unit tests of the project using mir interpreter |
| cmd rustc-tests { |
| /// Directory with Cargo.toml. |
| required rustc_repo: PathBuf |
| |
| /// Only run tests with filter as substring |
| optional --filter path: String |
| } |
| |
| cmd diagnostics { |
| /// Directory with Cargo.toml. |
| required path: PathBuf |
| |
| /// Don't run build scripts or load `OUT_DIR` values by running `cargo check` before analysis. |
| optional --disable-build-scripts |
| /// Don't use expand proc macros. |
| optional --disable-proc-macros |
| /// Run a custom proc-macro-srv binary. |
| optional --proc-macro-srv path: PathBuf |
| } |
| |
| cmd ssr { |
| /// A structured search replace rule (`$a.foo($b) ==>> bar($a, $b)`) |
| repeated rule: SsrRule |
| } |
| |
| cmd search { |
| /// A structured search replace pattern (`$a.foo($b)`) |
| repeated pattern: SsrPattern |
| /// Prints debug information for any nodes with source exactly equal to snippet. |
| optional --debug snippet: String |
| } |
| |
| cmd lsif { |
| required path: PathBuf |
| } |
| |
| cmd scip { |
| required path: PathBuf |
| |
| /// The output path where the SCIP file will be written to. Defaults to `index.scip`. |
| optional --output path: PathBuf |
| |
| /// A path to an json configuration file that can be used to customize cargo behavior. |
| optional --config-path config_path: PathBuf |
| } |
| } |
| } |
| |
| // generated start |
| // The following code is generated by `xflags` macro. |
| // Run `env UPDATE_XFLAGS=1 cargo build` to regenerate. |
| #[derive(Debug)] |
| pub struct RustAnalyzer { |
| pub verbose: u32, |
| pub quiet: bool, |
| pub log_file: Option<PathBuf>, |
| pub no_log_buffering: bool, |
| pub wait_dbg: bool, |
| pub subcommand: RustAnalyzerCmd, |
| } |
| |
| #[derive(Debug)] |
| pub enum RustAnalyzerCmd { |
| LspServer(LspServer), |
| Parse(Parse), |
| Symbols(Symbols), |
| Highlight(Highlight), |
| AnalysisStats(AnalysisStats), |
| RunTests(RunTests), |
| RustcTests(RustcTests), |
| Diagnostics(Diagnostics), |
| Ssr(Ssr), |
| Search(Search), |
| Lsif(Lsif), |
| Scip(Scip), |
| } |
| |
| #[derive(Debug)] |
| pub struct LspServer { |
| pub version: bool, |
| pub print_config_schema: bool, |
| } |
| |
| #[derive(Debug)] |
| pub struct Parse { |
| pub no_dump: bool, |
| } |
| |
| #[derive(Debug)] |
| pub struct Symbols; |
| |
| #[derive(Debug)] |
| pub struct Highlight { |
| pub rainbow: bool, |
| } |
| |
| #[derive(Debug)] |
| pub struct AnalysisStats { |
| pub path: PathBuf, |
| |
| pub output: Option<OutputFormat>, |
| pub randomize: bool, |
| pub parallel: bool, |
| pub source_stats: bool, |
| pub only: Option<String>, |
| pub with_deps: bool, |
| pub no_sysroot: bool, |
| pub disable_build_scripts: bool, |
| pub disable_proc_macros: bool, |
| pub skip_lowering: bool, |
| pub skip_inference: bool, |
| pub skip_mir_stats: bool, |
| pub skip_data_layout: bool, |
| pub skip_const_eval: bool, |
| pub run_all_ide_things: bool, |
| pub run_term_search: bool, |
| pub validate_term_search: bool, |
| } |
| |
| #[derive(Debug)] |
| pub struct RunTests { |
| pub path: PathBuf, |
| } |
| |
| #[derive(Debug)] |
| pub struct RustcTests { |
| pub rustc_repo: PathBuf, |
| |
| pub filter: Option<String>, |
| } |
| |
| #[derive(Debug)] |
| pub struct Diagnostics { |
| pub path: PathBuf, |
| |
| pub disable_build_scripts: bool, |
| pub disable_proc_macros: bool, |
| pub proc_macro_srv: Option<PathBuf>, |
| } |
| |
| #[derive(Debug)] |
| pub struct Ssr { |
| pub rule: Vec<SsrRule>, |
| } |
| |
| #[derive(Debug)] |
| pub struct Search { |
| pub pattern: Vec<SsrPattern>, |
| |
| pub debug: Option<String>, |
| } |
| |
| #[derive(Debug)] |
| pub struct Lsif { |
| pub path: PathBuf, |
| } |
| |
| #[derive(Debug)] |
| pub struct Scip { |
| pub path: PathBuf, |
| |
| pub output: Option<PathBuf>, |
| pub config_path: Option<PathBuf>, |
| } |
| |
| impl RustAnalyzer { |
| #[allow(dead_code)] |
| pub fn from_env_or_exit() -> Self { |
| Self::from_env_or_exit_() |
| } |
| |
| #[allow(dead_code)] |
| pub fn from_env() -> xflags::Result<Self> { |
| Self::from_env_() |
| } |
| |
| #[allow(dead_code)] |
| pub fn from_vec(args: Vec<std::ffi::OsString>) -> xflags::Result<Self> { |
| Self::from_vec_(args) |
| } |
| } |
| // generated end |
| |
| #[derive(Debug, PartialEq, Eq)] |
| pub enum OutputFormat { |
| Csv, |
| } |
| |
| impl RustAnalyzer { |
| pub fn verbosity(&self) -> Verbosity { |
| if self.quiet { |
| return Verbosity::Quiet; |
| } |
| match self.verbose { |
| 0 => Verbosity::Normal, |
| 1 => Verbosity::Verbose, |
| _ => Verbosity::Spammy, |
| } |
| } |
| } |
| |
| impl FromStr for OutputFormat { |
| type Err = String; |
| |
| fn from_str(s: &str) -> Result<Self, Self::Err> { |
| match s { |
| "csv" => Ok(Self::Csv), |
| _ => Err(format!("unknown output format `{s}`")), |
| } |
| } |
| } |