From 21aa0b8d842218b4cfa59830cf85df71730a0487 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 19 Jun 2023 15:32:58 -0400 Subject: [PATCH] Optimize `validate_arguments` (#10) --- parser/src/function.rs | 13 +++++++++---- parser/src/parser.rs | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/parser/src/function.rs b/parser/src/function.rs index 53ca0879..201a43b1 100644 --- a/parser/src/function.rs +++ b/parser/src/function.rs @@ -16,7 +16,14 @@ pub(crate) struct ArgumentList { // Perform validation of function/lambda arguments in a function definition. pub(crate) fn validate_arguments(arguments: &ast::Arguments) -> Result<(), LexicalError> { - let mut all_arg_names = FxHashSet::with_hasher(Default::default()); + let mut all_arg_names = FxHashSet::with_capacity_and_hasher( + arguments.posonlyargs.len() + + arguments.args.len() + + arguments.vararg.is_some() as usize + + arguments.kwonlyargs.len() + + arguments.kwarg.is_some() as usize, + Default::default(), + ); let posonlyargs = arguments.posonlyargs.iter(); let args = arguments.args.iter(); @@ -83,7 +90,7 @@ pub(crate) fn parse_args(func_args: Vec) -> Result { // Check for duplicate keyword arguments in the call. if let Some(keyword_name) = &name { - if keyword_names.contains(keyword_name) { + if !keyword_names.insert(keyword_name.clone()) { return Err(LexicalError { error: LexicalErrorType::DuplicateKeywordArgumentError( keyword_name.to_string(), @@ -91,8 +98,6 @@ pub(crate) fn parse_args(func_args: Vec) -> Result Tuple[*Ts]: ... #[test] #[cfg(feature = "all-nodes-with-ranges")] fn decorator_ranges() { - let parse_ast = parse_program( + let parse_ast = ast::Suite::parse( r#" @my_decorator def test():