Skip to content

Commit

Permalink
fix(linter): fix is_method_call with parentheses and chain expressi…
Browse files Browse the repository at this point in the history
…on (#7095)

I fixed `is_method_call` behavior in specific case below.

For example, when we use `is_method_call(call_expr, None,
Some(&["apply"]), Some(1), Some(1))` for
[`(a?.b.apply)(args)`](https://playground.oxc.rs/#eNpFjkEKg0AMRe+SVQviAdx057alN4gaZWBMJJmxFfHunVG0q+Qnn//fCi1UcMNH2ZQ4TX6531AHu0MBAtUKGjkPWzjgF6qgkQrwjsO5WysTXWIZG/GnCopsvegIVY/eaCtgQjXSnIjey+dNISo/YzDXUR25DU5S3+5OZqVknumFSmxHasrI7XtG2q+K89BKRwNl5iRGx653/xcHFV+n3gwwkzZiCf1g27YfdH1fTA==),
we cannot check correctly.

This is because we don't consider `call_expr` has parentheses and chain
expression.
  • Loading branch information
tbashiyy authored Nov 4, 2024
1 parent 25d7554 commit b73cfd9
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 2 deletions.
10 changes: 8 additions & 2 deletions crates/oxc_linter/src/ast_util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -332,8 +332,14 @@ pub fn is_method_call<'a>(
}
}

let Some(member_expr) = call_expr.callee.without_parentheses().as_member_expression() else {
return false;
let callee_without_parentheses = call_expr.callee.without_parentheses();
let member_expr = match callee_without_parentheses {
match_member_expression!(Expression) => callee_without_parentheses.to_member_expression(),
Expression::ChainExpression(chain) => match chain.expression {
match_member_expression!(ChainElement) => chain.expression.to_member_expression(),
ChainElement::CallExpression(_) => return false,
},
_ => return false,
};

if let Some(objects) = objects {
Expand Down
2 changes: 2 additions & 0 deletions crates/oxc_linter/src/rules/unicorn/prefer_array_flat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,7 @@ fn test() {
r"array.flatMap(() => x)",
r"array.flatMap((x, y) => x)",
r"array.flatMap(x => y)",
r"(array?.flatMap)?.(x => y)",
r"new array.reduce((a, b) => a.concat(b), [])",
r"array.reduce",
r"reduce((a, b) => a.concat(b), [])",
Expand Down Expand Up @@ -388,6 +389,7 @@ fn test() {

let fail = vec![
r"array.flatMap(x => x)",
r"(array?.flatMap)?.(x => x)",
r"function foo(){return[].flatMap(x => x)}",
r"foo.flatMap(x => x) instanceof Array",
r"array.reduce((a, b) => a.concat(b), [])",
Expand Down
9 changes: 9 additions & 0 deletions crates/oxc_linter/src/snapshots/prefer_array_flat.snap
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
---
source: crates/oxc_linter/src/tester.rs
assertion_line: 353
snapshot_kind: text
---
eslint-plugin-unicorn(prefer-array-flat): Prefer Array#flat() over legacy techniques to flatten arrays.
╭─[prefer_array_flat.tsx:1:1]
Expand All @@ -8,6 +10,13 @@ source: crates/oxc_linter/src/tester.rs
╰────
help: Call `.flat()` on the array instead.

eslint-plugin-unicorn(prefer-array-flat): Prefer Array#flat() over legacy techniques to flatten arrays.
╭─[prefer_array_flat.tsx:1:1]
1 │ (array?.flatMap)?.(x => x)
· ──────────────────────────
╰────
help: Call `.flat()` on the array instead.

eslint-plugin-unicorn(prefer-array-flat): Prefer Array#flat() over legacy techniques to flatten arrays.
╭─[prefer_array_flat.tsx:1:22]
1function foo(){return[].flatMap(x => x)}
Expand Down

0 comments on commit b73cfd9

Please sign in to comment.