diff options
| author | George Bateman <george.bateman16@gmail.com> | 2024-08-11 09:07:52 +0100 |
|---|---|---|
| committer | George Bateman <george.bateman16@gmail.com> | 2024-08-11 09:10:30 +0100 |
| commit | 6360287fd91c5d02597b45ef65c34388af348638 (patch) | |
| tree | 50fc07147cf5b9a64f0e19f5ce322cf6445cb4b2 /compiler/rustc_driver_impl | |
| parent | b389b0ab72cb0aa9acf4df0ae0c0e12090782da9 (diff) | |
| download | rust-6360287fd91c5d02597b45ef65c34388af348638.tar.gz rust-6360287fd91c5d02597b45ef65c34388af348638.zip | |
Fix #128930: Print documentation of CLI options missing their arg
Diffstat (limited to 'compiler/rustc_driver_impl')
| -rw-r--r-- | compiler/rustc_driver_impl/src/lib.rs | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/compiler/rustc_driver_impl/src/lib.rs b/compiler/rustc_driver_impl/src/lib.rs index 627a0ebb4e5..fa1b8e7c834 100644 --- a/compiler/rustc_driver_impl/src/lib.rs +++ b/compiler/rustc_driver_impl/src/lib.rs @@ -1221,17 +1221,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 // option stability here we just want to parse as much as possible. 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); } 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 .iter() .map(|&(name, ..)| ('C', name)) .chain(Z_OPTIONS.iter().map(|&(name, ..)| ('Z', name))) .find(|&(_, name)| *opt == name.replace('_', "-")) .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, }; early_dcx.early_fatal(msg.unwrap_or_else(|| e.to_string())); |
