From a11a2c36dc781d6084469e396e8c44e1677cd5b9 Mon Sep 17 00:00:00 2001 From: Calvin Date: Mon, 3 Mar 2025 07:15:53 +0800 Subject: [PATCH] chore: Use iterators to boost performance --- clap_builder/src/builder/debug_asserts.rs | 30 ++++++++++++--------- clap_builder/src/mkeymap.rs | 12 ++++----- clap_complete/src/aot/generator/utils.rs | 6 ++--- clap_complete/src/aot/shells/bash.rs | 16 ++++++------ clap_complete/src/aot/shells/zsh.rs | 32 +++++++++++------------ 5 files changed, 51 insertions(+), 45 deletions(-) diff --git a/clap_builder/src/builder/debug_asserts.rs b/clap_builder/src/builder/debug_asserts.rs index 28ef70eb725..d8199fc0b87 100644 --- a/clap_builder/src/builder/debug_asserts.rs +++ b/clap_builder/src/builder/debug_asserts.rs @@ -40,18 +40,20 @@ pub(crate) fn assert_app(cmd: &Command) { short_flags.push(Flag::Command(format!("-{s}"), sc.get_name())); } - for short_alias in sc.get_all_short_flag_aliases() { - short_flags.push(Flag::Command(format!("-{short_alias}"), sc.get_name())); - } + short_flags.extend( + sc.get_all_short_flag_aliases() + .map(|short_alias| Flag::Command(format!("-{short_alias}"), sc.get_name())), + ); if let Some(l) = sc.get_long_flag().as_ref() { assert!(!l.starts_with('-'), "Command {}: long_flag {:?} must not start with a `-`, that will be handled by the parser", sc.get_name(), l); long_flags.push(Flag::Command(format!("--{l}"), sc.get_name())); } - for long_alias in sc.get_all_long_flag_aliases() { - long_flags.push(Flag::Command(format!("--{long_alias}"), sc.get_name())); - } + long_flags.extend( + sc.get_all_long_flag_aliases() + .map(|long_alias| Flag::Command(format!("--{long_alias}"), sc.get_name())), + ); } for arg in cmd.get_arguments() { @@ -68,18 +70,22 @@ pub(crate) fn assert_app(cmd: &Command) { short_flags.push(Flag::Arg(format!("-{s}"), arg.get_id().as_str())); } - for (short_alias, _) in &arg.short_aliases { - short_flags.push(Flag::Arg(format!("-{short_alias}"), arg.get_id().as_str())); - } + short_flags.extend( + arg.short_aliases.iter().map(|(short_alias, _)| { + Flag::Arg(format!("-{short_alias}"), arg.get_id().as_str()) + }), + ); if let Some(l) = arg.get_long() { assert!(!l.starts_with('-'), "Argument {}: long {:?} must not start with a `-`, that will be handled by the parser", arg.get_id(), l); long_flags.push(Flag::Arg(format!("--{l}"), arg.get_id().as_str())); } - for (long_alias, _) in &arg.aliases { - long_flags.push(Flag::Arg(format!("--{long_alias}"), arg.get_id().as_str())); - } + long_flags.extend( + arg.aliases + .iter() + .map(|(long_alias, _)| Flag::Arg(format!("--{long_alias}"), arg.get_id().as_str())), + ); // Name conflicts if let Some((first, second)) = cmd.two_args_of(|x| x.get_id() == arg.get_id()) { diff --git a/clap_builder/src/mkeymap.rs b/clap_builder/src/mkeymap.rs index 57df7f0117d..05ec67c9ecc 100644 --- a/clap_builder/src/mkeymap.rs +++ b/clap_builder/src/mkeymap.rs @@ -176,13 +176,13 @@ fn append_keys(keys: &mut Vec, arg: &Arg, index: usize) { keys.push(Key { key, index }); } - for (short, _) in arg.short_aliases.iter() { + keys.extend(arg.short_aliases.iter().map(|(short, _)| { let key = KeyType::Short(*short); - keys.push(Key { key, index }); - } - for (long, _) in arg.aliases.iter() { + Key { key, index } + })); + keys.extend(arg.aliases.iter().map(|(long, _)| { let key = KeyType::Long(long.into()); - keys.push(Key { key, index }); - } + Key { key, index } + })); } } diff --git a/clap_complete/src/aot/generator/utils.rs b/clap_complete/src/aot/generator/utils.rs index da5a4d8a986..9877d0342c0 100644 --- a/clap_complete/src/aot/generator/utils.rs +++ b/clap_complete/src/aot/generator/utils.rs @@ -53,13 +53,13 @@ pub fn subcommands(p: &Command) -> Vec<(String, String)> { ); subcmds.push((sc.get_name().to_string(), sc_bin_name.to_string())); - for alias in sc.get_visible_aliases() { + subcmds.extend(sc.get_visible_aliases().map(|alias| { debug!( "subcommands:iter: alias={}, bin_name={}", alias, sc_bin_name ); - subcmds.push((alias.to_string(), sc_bin_name.to_string())); - } + (alias.to_string(), sc_bin_name.to_string()) + })); } subcmds diff --git a/clap_complete/src/aot/shells/bash.rs b/clap_complete/src/aot/shells/bash.rs index 6d0be2d297c..3708e54407d 100644 --- a/clap_complete/src/aot/shells/bash.rs +++ b/clap_complete/src/aot/shells/bash.rs @@ -93,13 +93,13 @@ fn all_subcommands(cmd: &Command, parent_fn_name: &str) -> String { cmd.get_name().to_string(), fn_name.clone(), )); - for alias in cmd.get_visible_aliases() { - subcmds.push(( + subcmds.extend(cmd.get_visible_aliases().map(|alias| { + ( parent_fn_name.to_string(), alias.to_string(), fn_name.clone(), - )); - } + ) + })); for subcmd in cmd.get_subcommands() { add_command(&fn_name, subcmd, subcmds); } @@ -111,13 +111,13 @@ fn all_subcommands(cmd: &Command, parent_fn_name: &str) -> String { subcmds.sort(); let mut cases = vec![String::new()]; - for (parent_fn_name, name, fn_name) in subcmds { - cases.push(format!( + cases.extend(subcmds.into_iter().map(|(parent_fn_name, name, fn_name)| { + format!( "{parent_fn_name},{name}) cmd=\"{fn_name}\" ;;", - )); - } + ) + })); cases.join("\n ") } diff --git a/clap_complete/src/aot/shells/zsh.rs b/clap_complete/src/aot/shells/zsh.rs index 64420095c4f..2c2a714ea74 100644 --- a/clap_complete/src/aot/shells/zsh.rs +++ b/clap_complete/src/aot/shells/zsh.rs @@ -116,10 +116,10 @@ _{bin_name_underscore}_commands() {{ all_subcommand_bins.sort(); all_subcommand_bins.dedup(); - for bin_name in &all_subcommand_bins { + ret.extend(all_subcommand_bins.iter().map(|bin_name| { debug!("subcommand_details:iter: bin_name={bin_name}"); - ret.push(format!( + format!( "\ (( $+functions[_{bin_name_underscore}_commands] )) || _{bin_name_underscore}_commands() {{ @@ -130,8 +130,8 @@ _{bin_name_underscore}_commands() {{ bin_name = bin_name, subcommands_and_args = subcommands_of(parser_of(p, bin_name).expect(INTERNAL_ERROR_MSG)) - )); - } + ) + })); ret.join("\n") } @@ -474,20 +474,20 @@ fn write_opts_of(p: &Command, p_global: Option<&Command>) -> String { let vc = vc.repeat(o.get_num_args().expect("built").min_values()); if let Some(shorts) = o.get_short_and_visible_aliases() { - for short in shorts { + ret.extend(shorts.into_iter().map(|short| { let s = format!("'{conflicts}{multiple}-{short}+[{help}]{vc}' \\"); debug!("write_opts_of:iter: Wrote...{}", &*s); - ret.push(s); - } + s + })); } if let Some(longs) = o.get_long_and_visible_aliases() { - for long in longs { + ret.extend(longs.into_iter().map(|long| { let l = format!("'{conflicts}{multiple}--{long}=[{help}]{vc}' \\"); debug!("write_opts_of:iter: Wrote...{}", &*l); - ret.push(l); - } + l + })); } } @@ -557,13 +557,13 @@ fn write_flags_of(p: &Command, p_global: Option<&Command>) -> String { ret.push(s); if let Some(short_aliases) = f.get_visible_short_aliases() { - for alias in short_aliases { + ret.extend(short_aliases.into_iter().map(|alias| { let s = format!("'{conflicts}{multiple}-{alias}[{help}]' \\",); debug!("write_flags_of:iter: Wrote...{}", &*s); - ret.push(s); - } + s + })); } } @@ -575,13 +575,13 @@ fn write_flags_of(p: &Command, p_global: Option<&Command>) -> String { ret.push(l); if let Some(aliases) = f.get_visible_aliases() { - for alias in aliases { + ret.extend(aliases.into_iter().map(|alias| { let l = format!("'{conflicts}{multiple}--{alias}[{help}]' \\"); debug!("write_flags_of:iter: Wrote...{}", &*l); - ret.push(l); - } + l + })); } } }