Rollup merge of #128961 - GKFX:issue-128930-explain-missing-option, r=jieyouxu
Fix #128930: Print documentation of CLI options missing their arg Fix #128930. Failing to give an argument to CLI options which require it now prints something like: ``` $ rustc --print error: Argument to option 'print' missing Usage: --print [crate-name|file-names|sysroot|target-libdir|cfg|check-cfg|calling-conventions|target-list|target-cpus|target-features|relocation-models|code-models|tls-models|target-spec-json|all-target-specs-json|native-static-libs|stack-protector-strategies|link-args|deployment-target] Compiler information to print on stdout ```
This commit is contained in:
commit
fe3428d9ac
@ -1218,17 +1218,30 @@ pub fn handle_options(early_dcx: &EarlyDiagCtxt, args: &[String]) -> Option<geto
|
|||||||
// Parse with *all* options defined in the compiler, we don't worry about
|
// Parse with *all* options defined in the compiler, we don't worry about
|
||||||
// option stability here we just want to parse as much as possible.
|
// option stability here we just want to parse as much as possible.
|
||||||
let mut options = getopts::Options::new();
|
let mut options = getopts::Options::new();
|
||||||
for option in config::rustc_optgroups() {
|
let optgroups = config::rustc_optgroups();
|
||||||
|
for option in &optgroups {
|
||||||
(option.apply)(&mut options);
|
(option.apply)(&mut options);
|
||||||
}
|
}
|
||||||
let matches = options.parse(args).unwrap_or_else(|e| {
|
let matches = options.parse(args).unwrap_or_else(|e| {
|
||||||
let msg = match e {
|
let msg: Option<String> = match e {
|
||||||
getopts::Fail::UnrecognizedOption(ref opt) => CG_OPTIONS
|
getopts::Fail::UnrecognizedOption(ref opt) => CG_OPTIONS
|
||||||
.iter()
|
.iter()
|
||||||
.map(|&(name, ..)| ('C', name))
|
.map(|&(name, ..)| ('C', name))
|
||||||
.chain(Z_OPTIONS.iter().map(|&(name, ..)| ('Z', name)))
|
.chain(Z_OPTIONS.iter().map(|&(name, ..)| ('Z', name)))
|
||||||
.find(|&(_, name)| *opt == name.replace('_', "-"))
|
.find(|&(_, name)| *opt == name.replace('_', "-"))
|
||||||
.map(|(flag, _)| format!("{e}. Did you mean `-{flag} {opt}`?")),
|
.map(|(flag, _)| format!("{e}. Did you mean `-{flag} {opt}`?")),
|
||||||
|
getopts::Fail::ArgumentMissing(ref opt) => {
|
||||||
|
optgroups.iter().find(|option| option.name == opt).map(|option| {
|
||||||
|
// Print the help just for the option in question.
|
||||||
|
let mut options = getopts::Options::new();
|
||||||
|
(option.apply)(&mut options);
|
||||||
|
// getopt requires us to pass a function for joining an iterator of
|
||||||
|
// strings, even though in this case we expect exactly one string.
|
||||||
|
options.usage_with_format(|it| {
|
||||||
|
it.fold(format!("{e}\nUsage:"), |a, b| a + "\n" + &b)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
};
|
};
|
||||||
early_dcx.early_fatal(msg.unwrap_or_else(|| e.to_string()));
|
early_dcx.early_fatal(msg.unwrap_or_else(|| e.to_string()));
|
||||||
|
@ -1376,7 +1376,7 @@ enum OptionStability {
|
|||||||
|
|
||||||
pub struct RustcOptGroup {
|
pub struct RustcOptGroup {
|
||||||
pub apply: Box<dyn Fn(&mut getopts::Options) -> &mut getopts::Options>,
|
pub apply: Box<dyn Fn(&mut getopts::Options) -> &mut getopts::Options>,
|
||||||
name: &'static str,
|
pub name: &'static str,
|
||||||
stability: OptionStability,
|
stability: OptionStability,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,2 +1,5 @@
|
|||||||
error: Argument to option 'cap-lints' missing
|
error: Argument to option 'cap-lints' missing
|
||||||
|
Usage:
|
||||||
|
--cap-lints LEVEL Set the most restrictive lint level. More restrictive
|
||||||
|
lints are capped at this level
|
||||||
|
|
||||||
|
1
tests/ui/invalid-compile-flags/print-without-arg.rs
Normal file
1
tests/ui/invalid-compile-flags/print-without-arg.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
//@ compile-flags: --print
|
5
tests/ui/invalid-compile-flags/print-without-arg.stderr
Normal file
5
tests/ui/invalid-compile-flags/print-without-arg.stderr
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
error: Argument to option 'print' missing
|
||||||
|
Usage:
|
||||||
|
--print [crate-name|file-names|sysroot|target-libdir|cfg|check-cfg|calling-conventions|target-list|target-cpus|target-features|relocation-models|code-models|tls-models|target-spec-json|all-target-specs-json|native-static-libs|stack-protector-strategies|link-args|deployment-target]
|
||||||
|
Compiler information to print on stdout
|
||||||
|
|
Loading…
Reference in New Issue
Block a user