diff --git a/src/build/app/mod.rs b/src/build/app/mod.rs index 2aef53ba0f8d..7b2772a70f5a 100644 --- a/src/build/app/mod.rs +++ b/src/build/app/mod.rs @@ -2704,21 +2704,20 @@ impl<'help> App<'help> { // Internally used only impl<'help> App<'help> { - fn get_used_global_args(&self, matcher: &ArgMatcher, global_arg_vec: &mut Vec) { + fn get_used_global_args(&self, matches: &ArgMatches, global_arg_vec: &mut Vec) { global_arg_vec.extend( self.args .args() .filter(|a| a.get_global()) .map(|ga| ga.id.clone()), ); - if let Some(used_subcommand) = matcher.subcommand.as_ref() { - if let Some(used_subcommand) = self - .subcommands - .iter() - .find(|subcommand| subcommand.id == used_subcommand.id) - { - return used_subcommand.get_used_global_args(matcher, global_arg_vec); + match matches.subcommand() { + Some((id, matches)) => { + if let Some(used_sub) = self.find_subcommand(id) { + return used_sub.get_used_global_args(matches, global_arg_vec); + } } + _ => {} } } diff --git a/tests/builder/global_args.rs b/tests/builder/global_args.rs index 5af286c37e5a..c04468d5b803 100644 --- a/tests/builder/global_args.rs +++ b/tests/builder/global_args.rs @@ -88,3 +88,23 @@ fn global_arg_available_in_subcommand() { assert!(m.is_present("global")); assert!(m.subcommand_matches("ping").unwrap().is_present("global")); } + +#[test] +fn deeply_nested_discovery() { + let app = App::new("a").arg(arg!(--"long-a").global(true)).subcommand( + App::new("b").arg(arg!(--"long-b").global(true)).subcommand( + App::new("c") + .arg(arg!(--"long-c").global(true)) + .subcommand(App::new("d")), + ), + ); + + let m = app + .try_get_matches_from(["a", "b", "c", "d", "--long-a", "--long-b", "--long-c"]) + .unwrap(); + assert!(m.is_present("long-a")); + let m = m.subcommand_matches("b").unwrap(); + assert!(m.is_present("long-b")); + let m = m.subcommand_matches("c").unwrap(); + assert!(m.is_present("long-c")); +}