From f5beccb7cd4bd9edcc57ef0e1dc42d220a272a1b Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Sat, 8 Apr 2023 12:29:07 +0800 Subject: [PATCH] `prefer-spread`: Stop checking `Array.from` call with map function (#2064) --- rules/prefer-spread.js | 26 +- test/prefer-spread.mjs | 22 +- test/snapshots/prefer-spread.mjs.md | 340 +++----------------------- test/snapshots/prefer-spread.mjs.snap | Bin 7584 -> 6771 bytes 4 files changed, 41 insertions(+), 347 deletions(-) diff --git a/rules/prefer-spread.js b/rules/prefer-spread.js index 670079b244..0982d77169 100644 --- a/rules/prefer-spread.js +++ b/rules/prefer-spread.js @@ -5,11 +5,7 @@ const needsSemicolon = require('./utils/needs-semicolon.js'); const {getParenthesizedRange, getParenthesizedText} = require('./utils/parentheses.js'); const shouldAddParenthesesToSpreadElementArgument = require('./utils/should-add-parentheses-to-spread-element-argument.js'); const {isNodeMatches} = require('./utils/is-node-matches.js'); -const { - replaceNodeOrTokenAndSpacesBefore, - removeSpacesAfter, - removeMethodCall, -} = require('./fix/index.js'); +const {removeMethodCall} = require('./fix/index.js'); const {isLiteral} = require('./ast/index.js'); const isMethodNamed = require('./utils/is-method-named.js'); @@ -40,8 +36,7 @@ const arrayFromCallSelector = [ methodCallSelector({ object: 'Array', method: 'from', - minimumArguments: 1, - maximumArguments: 3, + argumentsLength: 1, }), // Allow `Array.from({length})` '[arguments.0.type!="ObjectExpression"]', @@ -266,13 +261,6 @@ function fixArrayFrom(node, sourceCode) { return `[...${text}]`; } - function * removeObject(fixer) { - yield * replaceNodeOrTokenAndSpacesBefore(object, '', fixer, sourceCode); - const commaToken = sourceCode.getTokenAfter(object, isCommaToken); - yield * replaceNodeOrTokenAndSpacesBefore(commaToken, '', fixer, sourceCode); - yield removeSpacesAfter(commaToken, sourceCode, fixer); - } - return function * (fixer) { // Fixed code always starts with `[` if (needsSemicolon(sourceCode.getTokenBefore(node), sourceCode, '[')) { @@ -281,15 +269,7 @@ function fixArrayFrom(node, sourceCode) { const objectText = getObjectText(); - if (node.arguments.length === 1) { - yield fixer.replaceText(node, objectText); - return; - } - - // `Array.from(object, mapFunction, thisArgument)` -> `[...object].map(mapFunction, thisArgument)` - yield fixer.replaceText(node.callee.object, objectText); - yield fixer.replaceText(node.callee.property, 'map'); - yield * removeObject(fixer); + yield fixer.replaceText(node, objectText); }; } diff --git a/test/prefer-spread.mjs b/test/prefer-spread.mjs index ec7a8822f3..5cce345774 100644 --- a/test/prefer-spread.mjs +++ b/test/prefer-spread.mjs @@ -39,15 +39,15 @@ test.snapshot({ 'Array.from();', 'Array.from(foo, mapFn, thisArg, extra);', 'Array.from(...argumentsArray);', + 'Array.from(set, mapFn).reduce(() => {});', + 'Array.from(set, mapFn, thisArg).reduce(() => {});', + 'Array.from(set, () => {}, thisArg).reduce(() => {});', // FirstArgument is `ObjectExpression` 'Array.from({length: 10});', ], invalid: [ 'const x = Array.from(set);', 'Array.from(set).map(() => {});', - 'Array.from(set, mapFn).reduce(() => {});', - 'Array.from(set, mapFn, thisArg).reduce(() => {});', - 'Array.from(set, () => {}, thisArg).reduce(() => {});', 'Array.from(new Set([1, 2])).map(() => {});', 'Array.from(document.querySelectorAll("*")).map(() => {});', @@ -140,24 +140,10 @@ test.snapshot({ '(Array).from((0, foo))', '(Array.from)((0, foo))', '((Array).from)((0, foo))', - '(Array).from(foo, bar)', - '(Array.from)(foo, bar)', - '((Array).from)(foo, bar)', - '(Array).from((0, foo), bar)', - '(Array.from)((0, foo), bar)', - '((Array).from)((0, foo), bar)', - '(Array).from(foo, bar, baz)', - '(Array.from)(foo, bar, baz)', - '((Array).from)(foo, bar, baz)', - '(Array).from((0, foo), bar, baz)', - '(Array.from)((0, foo), bar, baz)', - '((Array).from)((0, foo), bar, baz)', - 'Array.from(a, (0, bar), (0, baz),)', 'Array.from(a ? b : c)', - 'Array.from([...a, ...b], b, c)', + 'Array.from([...a, ...b], )', 'Array.from([1])', 'Array.from([...a, ...b])', - '/* 1 */ Array /* 2 */ .from /* 3 */ ( /* 4 */ a /* 5 */, /* 6 */ b /* 7 */, /* 8 */ c /* 9 */,)', '/* 1 */ Array /* 2 */ .from /* 3 */ ( /* 4 */ a /* 5 */,)', ], }); diff --git a/test/snapshots/prefer-spread.mjs.md b/test/snapshots/prefer-spread.mjs.md index f1aed9185f..df68c27b95 100644 --- a/test/snapshots/prefer-spread.mjs.md +++ b/test/snapshots/prefer-spread.mjs.md @@ -37,54 +37,6 @@ Generated by [AVA](https://avajs.dev). ` ## Invalid #3 - 1 | Array.from(set, mapFn).reduce(() => {}); - -> Output - - `␊ - 1 | [...set].map(mapFn).reduce(() => {});␊ - ` - -> Error 1/1 - - `␊ - > 1 | Array.from(set, mapFn).reduce(() => {});␊ - | ^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ - ` - -## Invalid #4 - 1 | Array.from(set, mapFn, thisArg).reduce(() => {}); - -> Output - - `␊ - 1 | [...set].map(mapFn, thisArg).reduce(() => {});␊ - ` - -> Error 1/1 - - `␊ - > 1 | Array.from(set, mapFn, thisArg).reduce(() => {});␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ - ` - -## Invalid #5 - 1 | Array.from(set, () => {}, thisArg).reduce(() => {}); - -> Output - - `␊ - 1 | [...set].map(() => {}, thisArg).reduce(() => {});␊ - ` - -> Error 1/1 - - `␊ - > 1 | Array.from(set, () => {}, thisArg).reduce(() => {});␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ - ` - -## Invalid #6 1 | Array.from(new Set([1, 2])).map(() => {}); > Output @@ -100,7 +52,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #7 +## Invalid #4 1 | Array.from(document.querySelectorAll("*")).map(() => {}); > Output @@ -116,7 +68,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #8 +## Invalid #5 1 | const foo = [] 2 | Array.from(arrayLike).forEach(doSomething) @@ -135,7 +87,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #9 +## Invalid #6 1 | const foo = "1" 2 | Array.from(arrayLike).forEach(doSomething) @@ -154,7 +106,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #10 +## Invalid #7 1 | const foo = null 2 | Array.from(arrayLike).forEach(doSomething) @@ -173,7 +125,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #11 +## Invalid #8 1 | const foo = true 2 | Array.from(arrayLike).forEach(doSomething) @@ -192,7 +144,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #12 +## Invalid #9 1 | const foo = 1 2 | Array.from(arrayLike).forEach(doSomething) @@ -211,7 +163,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #13 +## Invalid #10 1 | const foo = /./ 2 | Array.from(arrayLike).forEach(doSomething) @@ -230,7 +182,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #14 +## Invalid #11 1 | const foo = /./g 2 | Array.from(arrayLike).forEach(doSomething) @@ -249,7 +201,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #15 +## Invalid #12 1 | const foo = bar 2 | Array.from(arrayLike).forEach(doSomething) @@ -268,7 +220,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #16 +## Invalid #13 1 | const foo = bar.baz 2 | Array.from(arrayLike).forEach(doSomething) @@ -287,7 +239,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #17 +## Invalid #14 1 | function* foo() { 2 | yield Array.from(arrayLike).forEach(doSomething) 3 | } @@ -309,7 +261,7 @@ Generated by [AVA](https://avajs.dev). 3 | }␊ ` -## Invalid #18 +## Invalid #15 1 | const foo = `bar` 2 | Array.from(arrayLike).forEach(doSomething) @@ -328,7 +280,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #19 +## Invalid #16 1 | const foo = []; 2 | Array.from(arrayLike).forEach(doSomething) @@ -347,7 +299,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #20 +## Invalid #17 1 | for (const key of Array.from(arrayLike)) { 2 | } @@ -366,7 +318,7 @@ Generated by [AVA](https://avajs.dev). 2 | }␊ ` -## Invalid #21 +## Invalid #18 1 | for (const key in Array.from(arrayLike)) { 2 | } @@ -385,7 +337,7 @@ Generated by [AVA](https://avajs.dev). 2 | }␊ ` -## Invalid #22 +## Invalid #19 1 | const foo = `${Array.from(arrayLike)}` > Output @@ -401,7 +353,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #23 +## Invalid #20 1 | async function foo(){ 2 | return await Array.from(arrayLike) 3 | } @@ -423,7 +375,7 @@ Generated by [AVA](https://avajs.dev). 3 | }␊ ` -## Invalid #24 +## Invalid #21 1 | foo() 2 | Array.from(arrayLike).forEach(doSomething) @@ -442,7 +394,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #25 +## Invalid #22 1 | const foo = {} 2 | Array.from(arrayLike).forEach(doSomething) @@ -461,7 +413,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #26 +## Invalid #23 1 | (Array).from(foo) > Output @@ -477,7 +429,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #27 +## Invalid #24 1 | (Array.from)(foo) > Output @@ -493,7 +445,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #28 +## Invalid #25 1 | ((Array).from)(foo) > Output @@ -509,7 +461,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #29 +## Invalid #26 1 | (Array).from((0, foo)) > Output @@ -525,7 +477,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #30 +## Invalid #27 1 | (Array.from)((0, foo)) > Output @@ -541,7 +493,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #31 +## Invalid #28 1 | ((Array).from)((0, foo)) > Output @@ -557,215 +509,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #32 - 1 | (Array).from(foo, bar) - -> Output - - `␊ - 1 | ([...foo]).map(bar)␊ - ` - -> Error 1/1 - - `␊ - > 1 | (Array).from(foo, bar)␊ - | ^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ - ` - -## Invalid #33 - 1 | (Array.from)(foo, bar) - -> Output - - `␊ - 1 | ([...foo].map)(bar)␊ - ` - -> Error 1/1 - - `␊ - > 1 | (Array.from)(foo, bar)␊ - | ^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ - ` - -## Invalid #34 - 1 | ((Array).from)(foo, bar) - -> Output - - `␊ - 1 | (([...foo]).map)(bar)␊ - ` - -> Error 1/1 - - `␊ - > 1 | ((Array).from)(foo, bar)␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ - ` - -## Invalid #35 - 1 | (Array).from((0, foo), bar) - -> Output - - `␊ - 1 | ([...(0, foo)]).map(bar)␊ - ` - -> Error 1/1 - - `␊ - > 1 | (Array).from((0, foo), bar)␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ - ` - -## Invalid #36 - 1 | (Array.from)((0, foo), bar) - -> Output - - `␊ - 1 | ([...(0, foo)].map)(bar)␊ - ` - -> Error 1/1 - - `␊ - > 1 | (Array.from)((0, foo), bar)␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ - ` - -## Invalid #37 - 1 | ((Array).from)((0, foo), bar) - -> Output - - `␊ - 1 | (([...(0, foo)]).map)(bar)␊ - ` - -> Error 1/1 - - `␊ - > 1 | ((Array).from)((0, foo), bar)␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ - ` - -## Invalid #38 - 1 | (Array).from(foo, bar, baz) - -> Output - - `␊ - 1 | ([...foo]).map(bar, baz)␊ - ` - -> Error 1/1 - - `␊ - > 1 | (Array).from(foo, bar, baz)␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ - ` - -## Invalid #39 - 1 | (Array.from)(foo, bar, baz) - -> Output - - `␊ - 1 | ([...foo].map)(bar, baz)␊ - ` - -> Error 1/1 - - `␊ - > 1 | (Array.from)(foo, bar, baz)␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ - ` - -## Invalid #40 - 1 | ((Array).from)(foo, bar, baz) - -> Output - - `␊ - 1 | (([...foo]).map)(bar, baz)␊ - ` - -> Error 1/1 - - `␊ - > 1 | ((Array).from)(foo, bar, baz)␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ - ` - -## Invalid #41 - 1 | (Array).from((0, foo), bar, baz) - -> Output - - `␊ - 1 | ([...(0, foo)]).map(bar, baz)␊ - ` - -> Error 1/1 - - `␊ - > 1 | (Array).from((0, foo), bar, baz)␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ - ` - -## Invalid #42 - 1 | (Array.from)((0, foo), bar, baz) - -> Output - - `␊ - 1 | ([...(0, foo)].map)(bar, baz)␊ - ` - -> Error 1/1 - - `␊ - > 1 | (Array.from)((0, foo), bar, baz)␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ - ` - -## Invalid #43 - 1 | ((Array).from)((0, foo), bar, baz) - -> Output - - `␊ - 1 | (([...(0, foo)]).map)(bar, baz)␊ - ` - -> Error 1/1 - - `␊ - > 1 | ((Array).from)((0, foo), bar, baz)␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ - ` - -## Invalid #44 - 1 | Array.from(a, (0, bar), (0, baz),) - -> Output - - `␊ - 1 | [...a].map((0, bar), (0, baz),)␊ - ` - -> Error 1/1 - - `␊ - > 1 | Array.from(a, (0, bar), (0, baz),)␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ - ` - -## Invalid #45 +## Invalid #29 1 | Array.from(a ? b : c) > Output @@ -781,23 +525,23 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #46 - 1 | Array.from([...a, ...b], b, c) +## Invalid #30 + 1 | Array.from([...a, ...b], ) > Output `␊ - 1 | [...a, ...b].map(b, c)␊ + 1 | [...a, ...b]␊ ` > Error 1/1 `␊ - > 1 | Array.from([...a, ...b], b, c)␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ + > 1 | Array.from([...a, ...b], )␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #47 +## Invalid #31 1 | Array.from([1]) > Output @@ -813,7 +557,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #48 +## Invalid #32 1 | Array.from([...a, ...b]) > Output @@ -829,23 +573,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ ` -## Invalid #49 - 1 | /* 1 */ Array /* 2 */ .from /* 3 */ ( /* 4 */ a /* 5 */, /* 6 */ b /* 7 */, /* 8 */ c /* 9 */,) - -> Output - - `␊ - 1 | /* 1 */ [...a] /* 2 */ .map /* 3 */ ( /* 4 */ /* 5 *//* 6 */ b /* 7 */, /* 8 */ c /* 9 */,)␊ - ` - -> Error 1/1 - - `␊ - > 1 | /* 1 */ Array /* 2 */ .from /* 3 */ ( /* 4 */ a /* 5 */, /* 6 */ b /* 7 */, /* 8 */ c /* 9 */,)␊ - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Prefer the spread operator over \`Array.from(…)\`.␊ - ` - -## Invalid #50 +## Invalid #33 1 | /* 1 */ Array /* 2 */ .from /* 3 */ ( /* 4 */ a /* 5 */,) > Output diff --git a/test/snapshots/prefer-spread.mjs.snap b/test/snapshots/prefer-spread.mjs.snap index a7c3747bf3f35b1d9b0b60c5a50bffe3e8e561ff..92cb15cedc6d26ab9ef360aeecf0d9a618e42a22 100644 GIT binary patch literal 6771 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 CTDkiG