mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 12:21:58 +00:00
perf(linter): optmize allocations in jest fn parsing (#4787)
This commit is contained in:
parent
4dd29dbc2b
commit
d191823a0a
1 changed files with 17 additions and 16 deletions
|
|
@ -33,7 +33,7 @@ pub fn parse_jest_fn_call<'a>(
|
||||||
parent_kind: Some(KnownMemberExpressionParentKind::Call),
|
parent_kind: Some(KnownMemberExpressionParentKind::Call),
|
||||||
grandparent_kind: None,
|
grandparent_kind: None,
|
||||||
};
|
};
|
||||||
let chain = get_node_chain(¶ms);
|
let mut chain = get_node_chain(¶ms);
|
||||||
let all_member_expr_except_last =
|
let all_member_expr_except_last =
|
||||||
chain.iter().rev().skip(1).all(|member| {
|
chain.iter().rev().skip(1).all(|member| {
|
||||||
matches!(member.parent_kind, Some(KnownMemberExpressionParentKind::Member))
|
matches!(member.parent_kind, Some(KnownMemberExpressionParentKind::Member))
|
||||||
|
|
@ -57,16 +57,14 @@ pub fn parse_jest_fn_call<'a>(
|
||||||
|
|
||||||
let name = resolved.original.unwrap_or(resolved.local);
|
let name = resolved.original.unwrap_or(resolved.local);
|
||||||
let kind = JestFnKind::from(name);
|
let kind = JestFnKind::from(name);
|
||||||
let mut members = Vec::new();
|
|
||||||
let mut iter = chain.into_iter();
|
|
||||||
let head = iter.next()?;
|
|
||||||
let rest = iter;
|
|
||||||
|
|
||||||
// every member node must have a member expression as their parent
|
// every member node must have a member expression as their parent
|
||||||
// in order to be part of the call chain we're parsing
|
// in order to be part of the call chain we're parsing
|
||||||
for member in rest {
|
let (head, members) = {
|
||||||
members.push(member);
|
let rest = chain.split_off(1);
|
||||||
}
|
let head = chain.into_iter().next().unwrap();
|
||||||
|
(head, rest)
|
||||||
|
};
|
||||||
|
|
||||||
if matches!(kind, JestFnKind::Expect | JestFnKind::ExpectTypeOf) {
|
if matches!(kind, JestFnKind::Expect | JestFnKind::ExpectTypeOf) {
|
||||||
let options = ExpectFnCallOptions {
|
let options = ExpectFnCallOptions {
|
||||||
|
|
@ -465,6 +463,14 @@ struct NodeChainParams<'a> {
|
||||||
/// Port from [eslint-plugin-jest](https://github.com/jest-community/eslint-plugin-jest/blob/a058f22f94774eeea7980ea2d1f24c6808bf3e2c/src/rules/utils/parseJestFnCall.ts#L36-L51)
|
/// Port from [eslint-plugin-jest](https://github.com/jest-community/eslint-plugin-jest/blob/a058f22f94774eeea7980ea2d1f24c6808bf3e2c/src/rules/utils/parseJestFnCall.ts#L36-L51)
|
||||||
fn get_node_chain<'a>(params: &NodeChainParams<'a>) -> Vec<KnownMemberExpressionProperty<'a>> {
|
fn get_node_chain<'a>(params: &NodeChainParams<'a>) -> Vec<KnownMemberExpressionProperty<'a>> {
|
||||||
let mut chain = Vec::new();
|
let mut chain = Vec::new();
|
||||||
|
recurse_extend_node_chain(params, &mut chain);
|
||||||
|
chain
|
||||||
|
}
|
||||||
|
|
||||||
|
fn recurse_extend_node_chain<'a>(
|
||||||
|
params: &NodeChainParams<'a>,
|
||||||
|
chain: &mut Vec<KnownMemberExpressionProperty<'a>>,
|
||||||
|
) {
|
||||||
let NodeChainParams { expr, parent, parent_kind, grandparent_kind } = params;
|
let NodeChainParams { expr, parent, parent_kind, grandparent_kind } = params;
|
||||||
|
|
||||||
match expr {
|
match expr {
|
||||||
|
|
@ -477,7 +483,7 @@ fn get_node_chain<'a>(params: &NodeChainParams<'a>) -> Vec<KnownMemberExpression
|
||||||
grandparent_kind: *parent_kind,
|
grandparent_kind: *parent_kind,
|
||||||
};
|
};
|
||||||
|
|
||||||
chain.extend(get_node_chain(¶ms));
|
recurse_extend_node_chain(¶ms, chain);
|
||||||
if let Some((span, element)) = MemberExpressionElement::from_member_expr(member_expr) {
|
if let Some((span, element)) = MemberExpressionElement::from_member_expr(member_expr) {
|
||||||
chain.push(KnownMemberExpressionProperty {
|
chain.push(KnownMemberExpressionProperty {
|
||||||
element,
|
element,
|
||||||
|
|
@ -504,8 +510,7 @@ fn get_node_chain<'a>(params: &NodeChainParams<'a>) -> Vec<KnownMemberExpression
|
||||||
parent_kind: Some(KnownMemberExpressionParentKind::Call),
|
parent_kind: Some(KnownMemberExpressionParentKind::Call),
|
||||||
grandparent_kind: *parent_kind,
|
grandparent_kind: *parent_kind,
|
||||||
};
|
};
|
||||||
let sub_chain = get_node_chain(¶ms);
|
recurse_extend_node_chain(¶ms, chain);
|
||||||
chain.extend(sub_chain);
|
|
||||||
}
|
}
|
||||||
Expression::TaggedTemplateExpression(tagged_expr) => {
|
Expression::TaggedTemplateExpression(tagged_expr) => {
|
||||||
let params = NodeChainParams {
|
let params = NodeChainParams {
|
||||||
|
|
@ -514,9 +519,7 @@ fn get_node_chain<'a>(params: &NodeChainParams<'a>) -> Vec<KnownMemberExpression
|
||||||
parent_kind: Some(KnownMemberExpressionParentKind::TaggedTemplate),
|
parent_kind: Some(KnownMemberExpressionParentKind::TaggedTemplate),
|
||||||
grandparent_kind: *parent_kind,
|
grandparent_kind: *parent_kind,
|
||||||
};
|
};
|
||||||
|
recurse_extend_node_chain(¶ms, chain);
|
||||||
let sub_chain = get_node_chain(¶ms);
|
|
||||||
chain.extend(sub_chain);
|
|
||||||
}
|
}
|
||||||
Expression::StringLiteral(string_literal) => {
|
Expression::StringLiteral(string_literal) => {
|
||||||
chain.push(KnownMemberExpressionProperty {
|
chain.push(KnownMemberExpressionProperty {
|
||||||
|
|
@ -538,8 +541,6 @@ fn get_node_chain<'a>(params: &NodeChainParams<'a>) -> Vec<KnownMemberExpression
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
};
|
};
|
||||||
|
|
||||||
chain
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// sorted list for binary search.
|
// sorted list for binary search.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue