Skip to content

Commit d191823

Browse files
committed
perf(linter): optmize allocations in jest fn parsing (#4787)
1 parent 4dd29db commit d191823

File tree

1 file changed

+17
-16
lines changed

1 file changed

+17
-16
lines changed

crates/oxc_linter/src/utils/jest/parse_jest_fn.rs

+17-16
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ pub fn parse_jest_fn_call<'a>(
3333
parent_kind: Some(KnownMemberExpressionParentKind::Call),
3434
grandparent_kind: None,
3535
};
36-
let chain = get_node_chain(&params);
36+
let mut chain = get_node_chain(&params);
3737
let all_member_expr_except_last =
3838
chain.iter().rev().skip(1).all(|member| {
3939
matches!(member.parent_kind, Some(KnownMemberExpressionParentKind::Member))
@@ -57,16 +57,14 @@ pub fn parse_jest_fn_call<'a>(
5757

5858
let name = resolved.original.unwrap_or(resolved.local);
5959
let kind = JestFnKind::from(name);
60-
let mut members = Vec::new();
61-
let mut iter = chain.into_iter();
62-
let head = iter.next()?;
63-
let rest = iter;
6460

6561
// every member node must have a member expression as their parent
6662
// in order to be part of the call chain we're parsing
67-
for member in rest {
68-
members.push(member);
69-
}
63+
let (head, members) = {
64+
let rest = chain.split_off(1);
65+
let head = chain.into_iter().next().unwrap();
66+
(head, rest)
67+
};
7068

7169
if matches!(kind, JestFnKind::Expect | JestFnKind::ExpectTypeOf) {
7270
let options = ExpectFnCallOptions {
@@ -465,6 +463,14 @@ struct NodeChainParams<'a> {
465463
/// Port from [eslint-plugin-jest](https://github.com/jest-community/eslint-plugin-jest/blob/a058f22f94774eeea7980ea2d1f24c6808bf3e2c/src/rules/utils/parseJestFnCall.ts#L36-L51)
466464
fn get_node_chain<'a>(params: &NodeChainParams<'a>) -> Vec<KnownMemberExpressionProperty<'a>> {
467465
let mut chain = Vec::new();
466+
recurse_extend_node_chain(params, &mut chain);
467+
chain
468+
}
469+
470+
fn recurse_extend_node_chain<'a>(
471+
params: &NodeChainParams<'a>,
472+
chain: &mut Vec<KnownMemberExpressionProperty<'a>>,
473+
) {
468474
let NodeChainParams { expr, parent, parent_kind, grandparent_kind } = params;
469475

470476
match expr {
@@ -477,7 +483,7 @@ fn get_node_chain<'a>(params: &NodeChainParams<'a>) -> Vec<KnownMemberExpression
477483
grandparent_kind: *parent_kind,
478484
};
479485

480-
chain.extend(get_node_chain(&params));
486+
recurse_extend_node_chain(&params, chain);
481487
if let Some((span, element)) = MemberExpressionElement::from_member_expr(member_expr) {
482488
chain.push(KnownMemberExpressionProperty {
483489
element,
@@ -504,8 +510,7 @@ fn get_node_chain<'a>(params: &NodeChainParams<'a>) -> Vec<KnownMemberExpression
504510
parent_kind: Some(KnownMemberExpressionParentKind::Call),
505511
grandparent_kind: *parent_kind,
506512
};
507-
let sub_chain = get_node_chain(&params);
508-
chain.extend(sub_chain);
513+
recurse_extend_node_chain(&params, chain);
509514
}
510515
Expression::TaggedTemplateExpression(tagged_expr) => {
511516
let params = NodeChainParams {
@@ -514,9 +519,7 @@ fn get_node_chain<'a>(params: &NodeChainParams<'a>) -> Vec<KnownMemberExpression
514519
parent_kind: Some(KnownMemberExpressionParentKind::TaggedTemplate),
515520
grandparent_kind: *parent_kind,
516521
};
517-
518-
let sub_chain = get_node_chain(&params);
519-
chain.extend(sub_chain);
522+
recurse_extend_node_chain(&params, chain);
520523
}
521524
Expression::StringLiteral(string_literal) => {
522525
chain.push(KnownMemberExpressionProperty {
@@ -538,8 +541,6 @@ fn get_node_chain<'a>(params: &NodeChainParams<'a>) -> Vec<KnownMemberExpression
538541
}
539542
_ => {}
540543
};
541-
542-
chain
543544
}
544545

545546
// sorted list for binary search.

0 commit comments

Comments
 (0)