diff --git a/crates/oxc_linter/src/utils/jest/parse_jest_fn.rs b/crates/oxc_linter/src/utils/jest/parse_jest_fn.rs index b23a9489f51ed..1af3509fc5a1d 100644 --- a/crates/oxc_linter/src/utils/jest/parse_jest_fn.rs +++ b/crates/oxc_linter/src/utils/jest/parse_jest_fn.rs @@ -33,7 +33,7 @@ pub fn parse_jest_fn_call<'a>( parent_kind: Some(KnownMemberExpressionParentKind::Call), grandparent_kind: None, }; - let chain = get_node_chain(¶ms); + let mut chain = get_node_chain(¶ms); let all_member_expr_except_last = chain.iter().rev().skip(1).all(|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 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 // in order to be part of the call chain we're parsing - for member in rest { - members.push(member); - } + let (head, members) = { + let rest = chain.split_off(1); + let head = chain.into_iter().next().unwrap(); + (head, rest) + }; if matches!(kind, JestFnKind::Expect | JestFnKind::ExpectTypeOf) { 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) fn get_node_chain<'a>(params: &NodeChainParams<'a>) -> Vec> { 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>, +) { let NodeChainParams { expr, parent, parent_kind, grandparent_kind } = params; match expr { @@ -477,7 +483,7 @@ fn get_node_chain<'a>(params: &NodeChainParams<'a>) -> Vec(params: &NodeChainParams<'a>) -> Vec { let params = NodeChainParams { @@ -514,9 +519,7 @@ fn get_node_chain<'a>(params: &NodeChainParams<'a>) -> Vec { chain.push(KnownMemberExpressionProperty { @@ -538,8 +541,6 @@ fn get_node_chain<'a>(params: &NodeChainParams<'a>) -> Vec {} }; - - chain } // sorted list for binary search.