Optimize validate_arguments (#10)

This commit is contained in:
Charlie Marsh
2023-06-19 15:32:58 -04:00
committed by GitHub
parent 9cb00518e5
commit 21aa0b8d84
2 changed files with 10 additions and 5 deletions

View File

@@ -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<FunctionArgument>) -> Result<ArgumentLis
Some((start, end, name)) => {
// 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<FunctionArgument>) -> Result<ArgumentLis
location: start,
});
}
keyword_names.insert(keyword_name.clone());
} else {
double_starred = true;
}

View File

@@ -1104,7 +1104,7 @@ def args_to_tuple(*args: *Ts) -> 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():