mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 12:21:58 +00:00
feat(linter/jest): add new property for parse_jest_fn (#2715)
This pr is to add a new return value: `local`, which current property
`name` always return `expect` and the `local` property will return its
alias name for the following example:
```js
import { expect as JEST_EXPECT } from '@jest/globals';
```
and the `jest_expect_fn_call.name` will return `expect` and the
`jest_expect_fn_call.local` wil return `JEST_EXPECT`.
This commit is contained in:
parent
a5ddb5b452
commit
4947809772
3 changed files with 20 additions and 5 deletions
|
|
@ -94,7 +94,7 @@ fn run<'a>(possible_jest_node: &PossibleJestNode<'a, '_>, ctx: &LintContext<'a>)
|
||||||
let node = possible_jest_node.node;
|
let node = possible_jest_node.node;
|
||||||
if let AstKind::CallExpression(call_expr) = node.kind() {
|
if let AstKind::CallExpression(call_expr) = node.kind() {
|
||||||
if let Some(jest_fn_call) = parse_general_jest_fn_call(call_expr, possible_jest_node, ctx) {
|
if let Some(jest_fn_call) = parse_general_jest_fn_call(call_expr, possible_jest_node, ctx) {
|
||||||
let ParsedGeneralJestFnCall { kind, members, name } = jest_fn_call;
|
let ParsedGeneralJestFnCall { kind, members, name, .. } = jest_fn_call;
|
||||||
// `test('foo')`
|
// `test('foo')`
|
||||||
let kind = match kind {
|
let kind = match kind {
|
||||||
JestFnKind::Expect | JestFnKind::Unknown => return,
|
JestFnKind::Expect | JestFnKind::Unknown => return,
|
||||||
|
|
|
||||||
|
|
@ -70,7 +70,7 @@ fn run<'a>(possible_jest_node: &PossibleJestNode<'a, '_>, ctx: &LintContext<'a>)
|
||||||
let Some(jest_fn_call) = parse_general_jest_fn_call(call_expr, possible_jest_node, ctx) else {
|
let Some(jest_fn_call) = parse_general_jest_fn_call(call_expr, possible_jest_node, ctx) else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
let ParsedGeneralJestFnCall { kind, members, name } = jest_fn_call;
|
let ParsedGeneralJestFnCall { kind, members, name, .. } = jest_fn_call;
|
||||||
if !matches!(kind, JestFnKind::General(JestGeneralFnKind::Describe | JestGeneralFnKind::Test)) {
|
if !matches!(kind, JestFnKind::General(JestGeneralFnKind::Describe | JestGeneralFnKind::Test)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,15 @@ pub fn parse_jest_fn_call<'a>(
|
||||||
}
|
}
|
||||||
|
|
||||||
if matches!(kind, JestFnKind::Expect) {
|
if matches!(kind, JestFnKind::Expect) {
|
||||||
let options = ExpectFnCallOptions { call_expr, members, name, head, node, ctx };
|
let options = ExpectFnCallOptions {
|
||||||
|
call_expr,
|
||||||
|
members,
|
||||||
|
name,
|
||||||
|
local: resolved.local,
|
||||||
|
head,
|
||||||
|
node,
|
||||||
|
ctx,
|
||||||
|
};
|
||||||
return parse_jest_expect_fn_call(options);
|
return parse_jest_expect_fn_call(options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -80,7 +88,7 @@ pub fn parse_jest_fn_call<'a>(
|
||||||
}
|
}
|
||||||
|
|
||||||
if matches!(kind, JestFnKind::General(JestGeneralFnKind::Jest)) {
|
if matches!(kind, JestFnKind::General(JestGeneralFnKind::Jest)) {
|
||||||
return parse_jest_jest_fn_call(members, name);
|
return parse_jest_jest_fn_call(members, name, resolved.local);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check every link in the chain except the last is a member expression
|
// Check every link in the chain except the last is a member expression
|
||||||
|
|
@ -98,6 +106,7 @@ pub fn parse_jest_fn_call<'a>(
|
||||||
kind,
|
kind,
|
||||||
members,
|
members,
|
||||||
name: Cow::Borrowed(name),
|
name: Cow::Borrowed(name),
|
||||||
|
local: Cow::Borrowed(resolved.local),
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -107,7 +116,7 @@ pub fn parse_jest_fn_call<'a>(
|
||||||
fn parse_jest_expect_fn_call<'a>(
|
fn parse_jest_expect_fn_call<'a>(
|
||||||
options: ExpectFnCallOptions<'a, '_>,
|
options: ExpectFnCallOptions<'a, '_>,
|
||||||
) -> Option<ParsedJestFnCall<'a>> {
|
) -> Option<ParsedJestFnCall<'a>> {
|
||||||
let ExpectFnCallOptions { call_expr, members, name, head, node, ctx } = options;
|
let ExpectFnCallOptions { call_expr, members, name, local, head, node, ctx } = options;
|
||||||
let (modifiers, matcher, mut expect_error) = match find_modifiers_and_matcher(&members) {
|
let (modifiers, matcher, mut expect_error) = match find_modifiers_and_matcher(&members) {
|
||||||
Ok((modifier, matcher)) => (modifier, matcher, None),
|
Ok((modifier, matcher)) => (modifier, matcher, None),
|
||||||
Err(e) => (vec![], None, Some(e)),
|
Err(e) => (vec![], None, Some(e)),
|
||||||
|
|
@ -131,6 +140,7 @@ fn parse_jest_expect_fn_call<'a>(
|
||||||
head,
|
head,
|
||||||
members,
|
members,
|
||||||
name: Cow::Borrowed(name),
|
name: Cow::Borrowed(name),
|
||||||
|
local: Cow::Borrowed(local),
|
||||||
args: &call_expr.arguments,
|
args: &call_expr.arguments,
|
||||||
matcher_index: matcher,
|
matcher_index: matcher,
|
||||||
modifier_indices: modifiers,
|
modifier_indices: modifiers,
|
||||||
|
|
@ -222,6 +232,7 @@ fn is_top_most_call_expr<'a, 'b>(node: &'b AstNode<'a>, ctx: &'b LintContext<'a>
|
||||||
fn parse_jest_jest_fn_call<'a>(
|
fn parse_jest_jest_fn_call<'a>(
|
||||||
members: Vec<KnownMemberExpressionProperty<'a>>,
|
members: Vec<KnownMemberExpressionProperty<'a>>,
|
||||||
name: &'a str,
|
name: &'a str,
|
||||||
|
local: &'a str,
|
||||||
) -> Option<ParsedJestFnCall<'a>> {
|
) -> Option<ParsedJestFnCall<'a>> {
|
||||||
if !name.to_ascii_lowercase().eq_ignore_ascii_case("jest") {
|
if !name.to_ascii_lowercase().eq_ignore_ascii_case("jest") {
|
||||||
return None;
|
return None;
|
||||||
|
|
@ -231,6 +242,7 @@ fn parse_jest_jest_fn_call<'a>(
|
||||||
kind: JestFnKind::General(JestGeneralFnKind::Jest),
|
kind: JestFnKind::General(JestGeneralFnKind::Jest),
|
||||||
members,
|
members,
|
||||||
name: Cow::Borrowed(name),
|
name: Cow::Borrowed(name),
|
||||||
|
local: Cow::Borrowed(local),
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -245,6 +257,7 @@ pub struct ExpectFnCallOptions<'a, 'b> {
|
||||||
pub call_expr: &'a CallExpression<'a>,
|
pub call_expr: &'a CallExpression<'a>,
|
||||||
pub members: Vec<KnownMemberExpressionProperty<'a>>,
|
pub members: Vec<KnownMemberExpressionProperty<'a>>,
|
||||||
pub name: &'a str,
|
pub name: &'a str,
|
||||||
|
pub local: &'a Atom<'a>,
|
||||||
pub head: KnownMemberExpressionProperty<'a>,
|
pub head: KnownMemberExpressionProperty<'a>,
|
||||||
pub node: &'b AstNode<'a>,
|
pub node: &'b AstNode<'a>,
|
||||||
pub ctx: &'b LintContext<'a>,
|
pub ctx: &'b LintContext<'a>,
|
||||||
|
|
@ -305,12 +318,14 @@ pub struct ParsedGeneralJestFnCall<'a> {
|
||||||
pub kind: JestFnKind,
|
pub kind: JestFnKind,
|
||||||
pub members: Vec<KnownMemberExpressionProperty<'a>>,
|
pub members: Vec<KnownMemberExpressionProperty<'a>>,
|
||||||
pub name: Cow<'a, str>,
|
pub name: Cow<'a, str>,
|
||||||
|
pub local: Cow<'a, str>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ParsedExpectFnCall<'a> {
|
pub struct ParsedExpectFnCall<'a> {
|
||||||
pub kind: JestFnKind,
|
pub kind: JestFnKind,
|
||||||
pub members: Vec<KnownMemberExpressionProperty<'a>>,
|
pub members: Vec<KnownMemberExpressionProperty<'a>>,
|
||||||
pub name: Cow<'a, str>,
|
pub name: Cow<'a, str>,
|
||||||
|
pub local: Cow<'a, str>,
|
||||||
pub head: KnownMemberExpressionProperty<'a>,
|
pub head: KnownMemberExpressionProperty<'a>,
|
||||||
pub args: &'a oxc_allocator::Vec<'a, Argument<'a>>,
|
pub args: &'a oxc_allocator::Vec<'a, Argument<'a>>,
|
||||||
// In `expect(1).not.resolved.toBe()`, "not", "resolved" will be modifier
|
// In `expect(1).not.resolved.toBe()`, "not", "resolved" will be modifier
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue