Skip to content

Commit 27037cb

Browse files
committed
fix(linter/prefer-array-flat-map): error for .flat(1.0)
1 parent 98b17e9 commit 27037cb

File tree

2 files changed

+47
-6
lines changed

2 files changed

+47
-6
lines changed

crates/oxc_linter/src/rules/unicorn/prefer_array_flat_map.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,10 @@ impl Rule for PreferArrayFlatMap {
6868
}
6969

7070
if let Some(first_arg) = flat_call_expr.arguments.first() {
71-
if let Argument::NumericLiteral(number_lit) = first_arg {
72-
if number_lit.raw.as_ref().unwrap() != "1" {
73-
return;
74-
}
75-
} else {
71+
// Strict comparison of `f64`s with `==` is appropriate here, because `lit.value` is derived
72+
// from a literal value in source, not from a calculation which might introduce imprecision
73+
#[expect(clippy::float_cmp)]
74+
if !matches!(first_arg, Argument::NumericLiteral(lit) if lit.value == 1.0) {
7675
return;
7776
}
7877
}
@@ -107,6 +106,9 @@ fn test() {
107106
("const bar = [[1],[2],[3]].flat()", None),
108107
("const bar = [1,2,3].map(i => [i]).sort().flat()", None),
109108
("const bar = [[1],[2],[3]].map(i => [i]).flat(2)", None),
109+
("const bar = [[1],[2],[3]].map(i => [i]).flat(2.0)", None),
110+
("const bar = [[1],[2],[3]].map(i => [i]).flat(0.9999999999999999)", None),
111+
("const bar = [[1],[2],[3]].map(i => [i]).flat(1.000000000000001)", None),
110112
("const bar = [[1],[2],[3]].map(i => [i]).flat(1, null)", None),
111113
("const bar = [[1],[2],[3]].map(i => [i]).flat(Infinity)", None),
112114
("const bar = [[1],[2],[3]].map(i => [i]).flat(Number.POSITIVE_INFINITY)", None),
@@ -117,11 +119,15 @@ fn test() {
117119
("const bar = [[1],[2],[3]].map(i => [i]).flat(+1)", None),
118120
("const bar = [[1],[2],[3]].map(i => [i]).flat(foo)", None),
119121
("const bar = [[1],[2],[3]].map(i => [i]).flat(foo.bar)", None),
120-
("const bar = [[1],[2],[3]].map(i => [i]).flat(1.00)", None),
121122
];
122123

123124
let fail = vec![
124125
("const bar = [[1],[2],[3]].map(i => [i]).flat()", None),
126+
("const bar = [[1],[2],[3]].map(i => [i]).flat(1)", None),
127+
("const bar = [[1],[2],[3]].map(i => [i]).flat(1.0)", None),
128+
("const bar = [[1],[2],[3]].map(i => [i]).flat(1.00)", None),
129+
("const bar = [[1],[2],[3]].map(i => [i]).flat(0.99999999999999999)", None),
130+
("const bar = [[1],[2],[3]].map(i => [i]).flat(1.0000000000000001)", None),
125131
("const bar = [[1],[2],[3]].map(i => [i]).flat(1,)", None),
126132
("const bar = [1,2,3].map(i => [i]).flat()", None),
127133
("const bar = [1,2,3].map((i) => [i]).flat()", None),

crates/oxc_linter/src/snapshots/unicorn_prefer_array_flat_map.snap

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,41 @@ source: crates/oxc_linter/src/tester.rs
88
╰────
99
help: Prefer `.flatMap(…)` over `.map(…).flat()`.
1010

11+
eslint-plugin-unicorn(prefer-array-flat-map): `Array.flatMap` performs `Array.map` and `Array.flat` in one step.
12+
╭─[prefer_array_flat_map.tsx:1:13]
13+
1const bar = [[1],[2],[3]].map(i => [i]).flat(1)
14+
· ───────────────────────────────────
15+
╰────
16+
help: Prefer `.flatMap(…)` over `.map(…).flat()`.
17+
18+
eslint-plugin-unicorn(prefer-array-flat-map): `Array.flatMap` performs `Array.map` and `Array.flat` in one step.
19+
╭─[prefer_array_flat_map.tsx:1:13]
20+
1const bar = [[1],[2],[3]].map(i => [i]).flat(1.0)
21+
· ─────────────────────────────────────
22+
╰────
23+
help: Prefer `.flatMap(…)` over `.map(…).flat()`.
24+
25+
eslint-plugin-unicorn(prefer-array-flat-map): `Array.flatMap` performs `Array.map` and `Array.flat` in one step.
26+
╭─[prefer_array_flat_map.tsx:1:13]
27+
1const bar = [[1],[2],[3]].map(i => [i]).flat(1.00)
28+
· ──────────────────────────────────────
29+
╰────
30+
help: Prefer `.flatMap(…)` over `.map(…).flat()`.
31+
32+
eslint-plugin-unicorn(prefer-array-flat-map): `Array.flatMap` performs `Array.map` and `Array.flat` in one step.
33+
╭─[prefer_array_flat_map.tsx:1:13]
34+
1const bar = [[1],[2],[3]].map(i => [i]).flat(0.99999999999999999)
35+
· ─────────────────────────────────────────────────────
36+
╰────
37+
help: Prefer `.flatMap(…)` over `.map(…).flat()`.
38+
39+
eslint-plugin-unicorn(prefer-array-flat-map): `Array.flatMap` performs `Array.map` and `Array.flat` in one step.
40+
╭─[prefer_array_flat_map.tsx:1:13]
41+
1const bar = [[1],[2],[3]].map(i => [i]).flat(1.0000000000000001)
42+
· ────────────────────────────────────────────────────
43+
╰────
44+
help: Prefer `.flatMap(…)` over `.map(…).flat()`.
45+
1146
eslint-plugin-unicorn(prefer-array-flat-map): `Array.flatMap` performs `Array.map` and `Array.flat` in one step.
1247
╭─[prefer_array_flat_map.tsx:1:13]
1348
1const bar = [[1],[2],[3]].map(i => [i]).flat(1,)

0 commit comments

Comments
 (0)