diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2024-11-11 15:23:34 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-11-11 15:23:34 +0100 |
| commit | bcd85e5434a4eac6ce75cc5daf0334c7d7f38229 (patch) | |
| tree | b567b28bebc9367b81b5314a73a0e4c9e9dd3c8d | |
| parent | 731966692372d33d7abf56b68ec317da0ccb63bd (diff) | |
| parent | 8b4701d74cc7bc1a9532716fd2bd25579102115d (diff) | |
| download | rust-bcd85e5434a4eac6ce75cc5daf0334c7d7f38229.tar.gz rust-bcd85e5434a4eac6ce75cc5daf0334c7d7f38229.zip | |
Rollup merge of #132891 - Zalathar:short-opt-groups, r=jieyouxu
Remove `rustc_session::config::rustc_short_optgroups` Follow-up to https://github.com/rust-lang/rust/pull/132754#discussion_r1835427349. The name `rustc_short_optgroups` has always been confusing, because it is unrelated to the distinction between short and long options (i.e. `-s` vs `--long`), and instead means something like “the subset of command-line options that are printed by `rustc --help` without `-v`”. So let's merge that function into the main `rustc_optgroups`, and store the relevant bit of information in a boolean field in `RustcOptGroup` instead. --- This PR also modifies `RustcOptGroup` to store its various strings directly, instead of inside a boxed `apply` closure. That turned out to not be necessary for the main change, but is a worthwhile cleanup in its own right.
| -rw-r--r-- | compiler/rustc_driver_impl/src/lib.rs | 7 | ||||
| -rw-r--r-- | compiler/rustc_session/src/config.rs | 103 |
2 files changed, 60 insertions, 50 deletions
diff --git a/compiler/rustc_driver_impl/src/lib.rs b/compiler/rustc_driver_impl/src/lib.rs index 78ba841d89f..b6f7abed6f3 100644 --- a/compiler/rustc_driver_impl/src/lib.rs +++ b/compiler/rustc_driver_impl/src/lib.rs @@ -934,9 +934,12 @@ pub fn version_at_macro_invocation( } fn usage(verbose: bool, include_unstable_options: bool, nightly_build: bool) { - let groups = if verbose { config::rustc_optgroups() } else { config::rustc_short_optgroups() }; let mut options = getopts::Options::new(); - for option in groups.iter().filter(|x| include_unstable_options || x.is_stable()) { + for option in config::rustc_optgroups() + .iter() + .filter(|x| verbose || !x.is_verbose_help_only) + .filter(|x| include_unstable_options || x.is_stable()) + { option.apply(&mut options); } let message = "Usage: rustc [OPTIONS] INPUT"; diff --git a/compiler/rustc_session/src/config.rs b/compiler/rustc_session/src/config.rs index 41cbca89af5..44721bd889a 100644 --- a/compiler/rustc_session/src/config.rs +++ b/compiler/rustc_session/src/config.rs @@ -1398,9 +1398,25 @@ pub enum OptionKind { } pub struct RustcOptGroup { - apply: Box<dyn Fn(&mut getopts::Options) -> &mut getopts::Options>, + /// The "primary" name for this option. Normally equal to `long_name`, + /// except for options that don't have a long name, in which case + /// `short_name` is used. + /// + /// This is needed when interacting with `getopts` in some situations, + /// because if an option has both forms, that library treats the long name + /// as primary and the short name as an alias. pub name: &'static str, stability: OptionStability, + kind: OptionKind, + + short_name: &'static str, + long_name: &'static str, + desc: &'static str, + value_hint: &'static str, + + /// If true, this option should not be printed by `rustc --help`, but + /// should still be printed by `rustc --help -v`. + pub is_verbose_help_only: bool, } impl RustcOptGroup { @@ -1409,7 +1425,13 @@ impl RustcOptGroup { } pub fn apply(&self, options: &mut getopts::Options) { - (self.apply)(options); + let &Self { short_name, long_name, desc, value_hint, .. } = self; + match self.kind { + OptionKind::Opt => options.optopt(short_name, long_name, desc, value_hint), + OptionKind::Multi => options.optmulti(short_name, long_name, desc, value_hint), + OptionKind::Flag => options.optflag(short_name, long_name, desc), + OptionKind::FlagMulti => options.optflagmulti(short_name, long_name, desc), + }; } } @@ -1419,31 +1441,22 @@ pub fn make_opt( short_name: &'static str, long_name: &'static str, desc: &'static str, - hint: &'static str, + value_hint: &'static str, ) -> RustcOptGroup { + // "Flag" options don't have a value, and therefore don't have a value hint. + match kind { + OptionKind::Opt | OptionKind::Multi => {} + OptionKind::Flag | OptionKind::FlagMulti => assert_eq!(value_hint, ""), + } RustcOptGroup { name: cmp::max_by_key(short_name, long_name, |s| s.len()), stability, - apply: match kind { - OptionKind::Opt => Box::new(move |opts: &mut getopts::Options| { - opts.optopt(short_name, long_name, desc, hint) - }), - OptionKind::Multi => Box::new(move |opts: &mut getopts::Options| { - opts.optmulti(short_name, long_name, desc, hint) - }), - OptionKind::Flag => { - assert_eq!(hint, ""); - Box::new(move |opts: &mut getopts::Options| { - opts.optflag(short_name, long_name, desc) - }) - } - OptionKind::FlagMulti => { - assert_eq!(hint, ""); - Box::new(move |opts: &mut getopts::Options| { - opts.optflagmulti(short_name, long_name, desc) - }) - } - }, + kind, + short_name, + long_name, + desc, + value_hint, + is_verbose_help_only: false, } } @@ -1454,16 +1467,15 @@ The default is {DEFAULT_EDITION} and the latest stable edition is {LATEST_STABLE ) }); -/// Returns the "short" subset of the rustc command line options, -/// including metadata for each option, such as whether the option is -/// part of the stable long-term interface for rustc. -pub fn rustc_short_optgroups() -> Vec<RustcOptGroup> { +/// Returns all rustc command line options, including metadata for +/// each option, such as whether the option is stable. +pub fn rustc_optgroups() -> Vec<RustcOptGroup> { use OptionKind::{Flag, FlagMulti, Multi, Opt}; - use OptionStability::Stable; + use OptionStability::{Stable, Unstable}; use self::make_opt as opt; - vec![ + let mut options = vec![ opt(Stable, Flag, "h", "help", "Display this message", ""), opt( Stable, @@ -1550,21 +1562,11 @@ pub fn rustc_short_optgroups() -> Vec<RustcOptGroup> { opt(Stable, Multi, "C", "codegen", "Set a codegen option", "OPT[=VALUE]"), opt(Stable, Flag, "V", "version", "Print version info and exit", ""), opt(Stable, Flag, "v", "verbose", "Use verbose output", ""), - ] -} - -/// Returns all rustc command line options, including metadata for -/// each option, such as whether the option is part of the stable -/// long-term interface for rustc. -pub fn rustc_optgroups() -> Vec<RustcOptGroup> { - use OptionKind::{Multi, Opt}; - use OptionStability::{Stable, Unstable}; - - use self::make_opt as opt; + ]; - let mut opts = rustc_short_optgroups(); - // FIXME: none of these descriptions are actually used - opts.extend(vec![ + // Options in this list are hidden from `rustc --help` by default, but are + // shown by `rustc --help -v`. + let verbose_only = [ opt( Stable, Multi, @@ -1590,9 +1592,9 @@ pub fn rustc_optgroups() -> Vec<RustcOptGroup> { "", "color", "Configure coloring of output: - auto = colorize, if output goes to a tty (default); - always = always colorize output; - never = never colorize output", + auto = colorize, if output goes to a tty (default); + always = always colorize output; + never = never colorize output", "auto|always|never", ), opt( @@ -1612,8 +1614,13 @@ pub fn rustc_optgroups() -> Vec<RustcOptGroup> { "FROM=TO", ), opt(Unstable, Multi, "", "env-set", "Inject an environment variable", "VAR=VALUE"), - ]); - opts + ]; + options.extend(verbose_only.into_iter().map(|mut opt| { + opt.is_verbose_help_only = true; + opt + })); + + options } pub fn get_cmd_lint_options( |
