Skip to content

Commit

Permalink
Auto merge of rust-lang#132902 - matthiaskrgr:rollup-43qgg3t, r=matth…
Browse files Browse the repository at this point in the history
…iaskrgr

Rollup of 4 pull requests

Successful merges:

 - rust-lang#129627 (Ensure that tail expr receive lifetime extension)
 - rust-lang#130999 (Implement file_lock feature)
 - rust-lang#132873 (handle separate prefixes in clippy rules)
 - rust-lang#132891 (Remove `rustc_session::config::rustc_short_optgroups`)

r? `@ghost`
`@rustbot` modify labels: rollup
  • Loading branch information
bors committed Nov 11, 2024
2 parents de27914 + bcd85e5 commit 81eef2d
Show file tree
Hide file tree
Showing 17 changed files with 674 additions and 57 deletions.
7 changes: 5 additions & 2 deletions compiler/rustc_driver_impl/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
103 changes: 55 additions & 48 deletions compiler/rustc_session/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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),
};
}
}

Expand All @@ -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,
}
}

Expand All @@ -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,
Expand Down Expand Up @@ -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,
Expand All @@ -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(
Expand All @@ -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(
Expand Down
Loading

0 comments on commit 81eef2d

Please sign in to comment.