From 0b08c68fdfb69580e885b5344d48db0bd4d7c774 Mon Sep 17 00:00:00 2001 From: fisker Date: Sat, 19 Nov 2022 15:21:39 +0800 Subject: [PATCH 01/14] Rename variable --- rules/no-useless-spread.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rules/no-useless-spread.js b/rules/no-useless-spread.js index 570b1dfc3c..2cc4de51b2 100644 --- a/rules/no-useless-spread.js +++ b/rules/no-useless-spread.js @@ -26,7 +26,7 @@ const uselessSpreadInListSelector = matches([ 'NewExpression > SpreadElement.arguments > ArrayExpression.argument', ]); -const iterableToArraySelector = [ +const singleArraySpreadSelector = [ 'ArrayExpression', '[elements.length=1]', '[elements.0.type="SpreadElement"]', @@ -49,10 +49,10 @@ const uselessIterableToArraySelector = matches([ methodCallSelector({object: 'Object', method: 'fromEntries', argumentsLength: 1}), ]), ' > ', - `${iterableToArraySelector}.arguments:first-child`, + `${singleArraySpreadSelector}.arguments:first-child`, ].join(''), - `ForOfStatement > ${iterableToArraySelector}.right`, - `YieldExpression[delegate=true] > ${iterableToArraySelector}.argument`, + `ForOfStatement > ${singleArraySpreadSelector}.right`, + `YieldExpression[delegate=true] > ${singleArraySpreadSelector}.argument`, ]); const parentDescriptions = { From f4a422b3ef2c06b4138639505871a1bd26de8825 Mon Sep 17 00:00:00 2001 From: fisker Date: Sat, 19 Nov 2022 15:45:10 +0800 Subject: [PATCH 02/14] Implement basic logic --- rules/no-useless-spread.js | 91 ++++++++++++------- rules/prefer-set-has.js | 26 +----- .../array-methods-returns-a-new-array.js | 27 ++++++ 3 files changed, 89 insertions(+), 55 deletions(-) create mode 100644 rules/shared/array-methods-returns-a-new-array.js diff --git a/rules/no-useless-spread.js b/rules/no-useless-spread.js index 2cc4de51b2..2f98247f1a 100644 --- a/rules/no-useless-spread.js +++ b/rules/no-useless-spread.js @@ -7,16 +7,19 @@ const { } = require('./selectors/index.js'); const typedArray = require('./shared/typed-array.js'); const {removeParentheses, fixSpaceAroundKeyword} = require('./fix/index.js'); +import arrayMethodsReturnsANewArray from './shared/array-methods-returns-a-new-array.js'; const SPREAD_IN_LIST = 'spread-in-list'; const ITERABLE_TO_ARRAY = 'iterable-to-array'; const ITERABLE_TO_ARRAY_IN_FOR_OF = 'iterable-to-array-in-for-of'; const ITERABLE_TO_ARRAY_IN_YIELD_STAR = 'iterable-to-array-in-yield-star'; +const CLONE_ARRAY = "clone-array"; const messages = { [SPREAD_IN_LIST]: 'Spread an {{argumentType}} literal in {{parentDescription}} is unnecessary.', [ITERABLE_TO_ARRAY]: '`{{parentDescription}}` accepts iterable as argument, it\'s unnecessary to convert to an array.', [ITERABLE_TO_ARRAY_IN_FOR_OF]: '`for…of` can iterate over iterable, it\'s unnecessary to convert to an array.', [ITERABLE_TO_ARRAY_IN_YIELD_STAR]: '`yield*` can delegate iterable, it\'s unnecessary to convert to an array.', + [CLONE_ARRAY]: 'Unnecessarily cloning an array.' }; const uselessSpreadInListSelector = matches([ @@ -55,6 +58,19 @@ const uselessIterableToArraySelector = matches([ `YieldExpression[delegate=true] > ${singleArraySpreadSelector}.argument`, ]); +// TODO[@fisker]: Unify this with immediate array selector in `prefer-set-has.js` +const uselessCloneImmediateArraySelector = [ + `${singleArraySpreadSelector} > .arguments:first-child`, + matches([ + // Array methods returns a new array + methodCallSelector(arrayMethodsReturnsANewArray), + // `String#split()` + methodCallSelector('split'), + // `Object.keys()` and `Object.values()` + methodCallSelector({object: 'Object', methods: ['keys', 'values']}), + ]), +].join('') + const parentDescriptions = { ArrayExpression: 'array literal', ObjectExpression: 'object literal', @@ -81,6 +97,36 @@ function getCommaTokens(arrayExpression, sourceCode) { }); } +function * unwrapSingleArraySpread(fixer, arrayExpression, sourceCode) { + const [ + openingBracketToken, + spreadToken, + ] = sourceCode.getFirstTokens(arrayExpression, 2); + + // `[...value]` + // ^ + yield fixer.remove(openingBracketToken); + + // `[...value]` + // ^^^ + yield fixer.remove(spreadToken); + + const [ + commaToken, + closingBracketToken, + ] = sourceCode.getLastTokens(arrayExpression, 2); + + // `[...value]` + // ^ + yield fixer.remove(closingBracketToken); + + // `[...value,]` + // ^ + if (isCommaToken(commaToken)) { + yield fixer.remove(commaToken); + } +} + /** @param {import('eslint').Rule.RuleContext} context */ const create = context => { const sourceCode = context.getSourceCode(); @@ -145,8 +191,8 @@ const create = context => { }, }; }, - [uselessIterableToArraySelector](array) { - const {parent} = array; + [uselessIterableToArraySelector](arrayExpression) { + const {parent} = arrayExpression; let parentDescription = ''; let messageId = ITERABLE_TO_ARRAY; switch (parent.type) { @@ -173,44 +219,27 @@ const create = context => { } return { - node: array, + node: arrayExpression, messageId, data: {parentDescription}, * fix(fixer) { if (parent.type === 'ForOfStatement') { - yield * fixSpaceAroundKeyword(fixer, array, sourceCode); + yield * fixSpaceAroundKeyword(fixer, arrayExpression, sourceCode); } - const [ - openingBracketToken, - spreadToken, - ] = sourceCode.getFirstTokens(array, 2); - - // `[...iterable]` - // ^ - yield fixer.remove(openingBracketToken); - - // `[...iterable]` - // ^^^ - yield fixer.remove(spreadToken); - - const [ - commaToken, - closingBracketToken, - ] = sourceCode.getLastTokens(array, 2); - - // `[...iterable]` - // ^ - yield fixer.remove(closingBracketToken); - - // `[...iterable,]` - // ^ - if (isCommaToken(commaToken)) { - yield fixer.remove(commaToken); - } + yield * unwrapSingleArraySpread(fixer, arrayExpression, sourceCode); }, }; }, + uselessCloneImmediateArraySelector(arrayExpression) { + return { + node: ArrayExpression, + messageId: CLONE_ARRAY, + * fix(fixer) { + yield * unwrapSingleArraySpread(fixer, arrayExpression, sourceCode); + }, + } + }, }; }; diff --git a/rules/prefer-set-has.js b/rules/prefer-set-has.js index ec0834761c..1e161a6b5b 100644 --- a/rules/prefer-set-has.js +++ b/rules/prefer-set-has.js @@ -7,6 +7,7 @@ const { methodCallSelector, callOrNewExpressionSelector, } = require('./selectors/index.js'); +import arrayMethodsReturnsANewArray from './shared/array-methods-returns-a-new-array.js'; const MESSAGE_ID_ERROR = 'error'; const MESSAGE_ID_SUGGESTION = 'suggestion'; @@ -30,31 +31,8 @@ const arrayStaticMethodSelector = methodCallSelector({ path: 'init', }); -// `array.concat()` -// `array.copyWithin()` -// `array.fill()` -// `array.filter()` -// `array.flat()` -// `array.flatMap()` -// `array.map()` -// `array.reverse()` -// `array.slice()` -// `array.sort()` -// `array.splice()` const arrayMethodSelector = methodCallSelector({ - methods: [ - 'concat', - 'copyWithin', - 'fill', - 'filter', - 'flat', - 'flatMap', - 'map', - 'reverse', - 'slice', - 'sort', - 'splice', - ], + methods: arrayMethodsReturnsANewArray, path: 'init', }); diff --git a/rules/shared/array-methods-returns-a-new-array.js b/rules/shared/array-methods-returns-a-new-array.js new file mode 100644 index 0000000000..1ef7277757 --- /dev/null +++ b/rules/shared/array-methods-returns-a-new-array.js @@ -0,0 +1,27 @@ +'use strict'; + +// `array.concat()` +// `array.copyWithin()` +// `array.fill()` +// `array.filter()` +// `array.flat()` +// `array.flatMap()` +// `array.map()` +// `array.reverse()` +// `array.slice()` +// `array.sort()` +// `array.splice()` + +module.exports = [ + 'concat', + 'copyWithin', + 'fill', + 'filter', + 'flat', + 'flatMap', + 'map', + 'reverse', + 'slice', + 'sort', + 'splice', +]; From 70864cad64be325611f72edc5340bd272df56857 Mon Sep 17 00:00:00 2001 From: fisker Date: Sat, 19 Nov 2022 16:00:43 +0800 Subject: [PATCH 03/14] Fix --- rules/no-useless-spread.js | 22 ++- rules/prefer-set-has.js | 26 ++- .../array-methods-returns-a-new-array.js | 27 --- test/no-useless-spread.mjs | 19 +- test/snapshots/no-useless-spread.mjs.md | 176 ++++++++++++++++++ test/snapshots/no-useless-spread.mjs.snap | Bin 4449 -> 4982 bytes 6 files changed, 233 insertions(+), 37 deletions(-) delete mode 100644 rules/shared/array-methods-returns-a-new-array.js diff --git a/rules/no-useless-spread.js b/rules/no-useless-spread.js index 2f98247f1a..5ccd4f16ec 100644 --- a/rules/no-useless-spread.js +++ b/rules/no-useless-spread.js @@ -7,7 +7,6 @@ const { } = require('./selectors/index.js'); const typedArray = require('./shared/typed-array.js'); const {removeParentheses, fixSpaceAroundKeyword} = require('./fix/index.js'); -import arrayMethodsReturnsANewArray from './shared/array-methods-returns-a-new-array.js'; const SPREAD_IN_LIST = 'spread-in-list'; const ITERABLE_TO_ARRAY = 'iterable-to-array'; @@ -58,18 +57,26 @@ const uselessIterableToArraySelector = matches([ `YieldExpression[delegate=true] > ${singleArraySpreadSelector}.argument`, ]); -// TODO[@fisker]: Unify this with immediate array selector in `prefer-set-has.js` const uselessCloneImmediateArraySelector = [ - `${singleArraySpreadSelector} > .arguments:first-child`, + `${singleArraySpreadSelector} > .elements:first-child > .argument`, matches([ // Array methods returns a new array - methodCallSelector(arrayMethodsReturnsANewArray), + methodCallSelector([ + 'concat', + 'copyWithin', + 'filter', + 'flat', + 'flatMap', + 'map', + 'slice', + 'splice', + ]), // `String#split()` methodCallSelector('split'), // `Object.keys()` and `Object.values()` methodCallSelector({object: 'Object', methods: ['keys', 'values']}), ]), -].join('') +].join(''); const parentDescriptions = { ArrayExpression: 'array literal', @@ -231,9 +238,10 @@ const create = context => { }, }; }, - uselessCloneImmediateArraySelector(arrayExpression) { + [uselessCloneImmediateArraySelector](node) { + const arrayExpression = node.parent.parent; return { - node: ArrayExpression, + node: arrayExpression, messageId: CLONE_ARRAY, * fix(fixer) { yield * unwrapSingleArraySpread(fixer, arrayExpression, sourceCode); diff --git a/rules/prefer-set-has.js b/rules/prefer-set-has.js index 1e161a6b5b..ec0834761c 100644 --- a/rules/prefer-set-has.js +++ b/rules/prefer-set-has.js @@ -7,7 +7,6 @@ const { methodCallSelector, callOrNewExpressionSelector, } = require('./selectors/index.js'); -import arrayMethodsReturnsANewArray from './shared/array-methods-returns-a-new-array.js'; const MESSAGE_ID_ERROR = 'error'; const MESSAGE_ID_SUGGESTION = 'suggestion'; @@ -31,8 +30,31 @@ const arrayStaticMethodSelector = methodCallSelector({ path: 'init', }); +// `array.concat()` +// `array.copyWithin()` +// `array.fill()` +// `array.filter()` +// `array.flat()` +// `array.flatMap()` +// `array.map()` +// `array.reverse()` +// `array.slice()` +// `array.sort()` +// `array.splice()` const arrayMethodSelector = methodCallSelector({ - methods: arrayMethodsReturnsANewArray, + methods: [ + 'concat', + 'copyWithin', + 'fill', + 'filter', + 'flat', + 'flatMap', + 'map', + 'reverse', + 'slice', + 'sort', + 'splice', + ], path: 'init', }); diff --git a/rules/shared/array-methods-returns-a-new-array.js b/rules/shared/array-methods-returns-a-new-array.js deleted file mode 100644 index 1ef7277757..0000000000 --- a/rules/shared/array-methods-returns-a-new-array.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict'; - -// `array.concat()` -// `array.copyWithin()` -// `array.fill()` -// `array.filter()` -// `array.flat()` -// `array.flatMap()` -// `array.map()` -// `array.reverse()` -// `array.slice()` -// `array.sort()` -// `array.splice()` - -module.exports = [ - 'concat', - 'copyWithin', - 'fill', - 'filter', - 'flat', - 'flatMap', - 'map', - 'reverse', - 'slice', - 'sort', - 'splice', -]; diff --git a/test/no-useless-spread.mjs b/test/no-useless-spread.mjs index adb975c1be..4dc2fdac4d 100644 --- a/test/no-useless-spread.mjs +++ b/test/no-useless-spread.mjs @@ -9,7 +9,6 @@ test.snapshot({ 'const array = [[]]', 'const array = [{}]', 'const object = ({...[]})', - 'const array = [...[].map(x => x)]', 'foo([])', 'foo({})', 'new Foo([])', @@ -241,6 +240,24 @@ test.snapshot({ ], }); +// Cloning an immediate array +test.snapshot({ + valid: [], + invalid: [ + '[...foo.concat(bar)]', + '[...foo.copyWithin(-2)]', + '[...foo.filter(bar)]', + '[...foo.flat()]', + '[...foo.flatMap(bar)]', + '[...foo.map(bar)]', + '[...foo.slice(1)]', + '[...foo.splice(1)]', + '[...foo.split("|")]', + '[...Object.keys(foo)]', + '[...Object.values(foo)]', + ], +}); + test.babel({ valid: [], invalid: [ diff --git a/test/snapshots/no-useless-spread.mjs.md b/test/snapshots/no-useless-spread.mjs.md index 56475ab77f..c718d39865 100644 --- a/test/snapshots/no-useless-spread.mjs.md +++ b/test/snapshots/no-useless-spread.mjs.md @@ -1553,3 +1553,179 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^^^^^^^^^^^^^ \`yield*\` can delegate iterable, it's unnecessary to convert to an array.␊ 3 | }␊ ` + +## Invalid #1 + 1 | [...foo.concat(bar)] + +> Output + + `␊ + 1 | foo.concat(bar)␊ + ` + +> Error 1/1 + + `␊ + > 1 | [...foo.concat(bar)]␊ + | ^^^^^^^^^^^^^^^^^^^^ Unnecessarily cloning an array.␊ + ` + +## Invalid #2 + 1 | [...foo.copyWithin(-2)] + +> Output + + `␊ + 1 | foo.copyWithin(-2)␊ + ` + +> Error 1/1 + + `␊ + > 1 | [...foo.copyWithin(-2)]␊ + | ^^^^^^^^^^^^^^^^^^^^^^^ Unnecessarily cloning an array.␊ + ` + +## Invalid #3 + 1 | [...foo.filter(bar)] + +> Output + + `␊ + 1 | foo.filter(bar)␊ + ` + +> Error 1/1 + + `␊ + > 1 | [...foo.filter(bar)]␊ + | ^^^^^^^^^^^^^^^^^^^^ Unnecessarily cloning an array.␊ + ` + +## Invalid #4 + 1 | [...foo.flat()] + +> Output + + `␊ + 1 | foo.flat()␊ + ` + +> Error 1/1 + + `␊ + > 1 | [...foo.flat()]␊ + | ^^^^^^^^^^^^^^^ Unnecessarily cloning an array.␊ + ` + +## Invalid #5 + 1 | [...foo.flatMap(bar)] + +> Output + + `␊ + 1 | foo.flatMap(bar)␊ + ` + +> Error 1/1 + + `␊ + > 1 | [...foo.flatMap(bar)]␊ + | ^^^^^^^^^^^^^^^^^^^^^ Unnecessarily cloning an array.␊ + ` + +## Invalid #6 + 1 | [...foo.map(bar)] + +> Output + + `␊ + 1 | foo.map(bar)␊ + ` + +> Error 1/1 + + `␊ + > 1 | [...foo.map(bar)]␊ + | ^^^^^^^^^^^^^^^^^ Unnecessarily cloning an array.␊ + ` + +## Invalid #7 + 1 | [...foo.slice(1)] + +> Output + + `␊ + 1 | foo.slice(1)␊ + ` + +> Error 1/1 + + `␊ + > 1 | [...foo.slice(1)]␊ + | ^^^^^^^^^^^^^^^^^ Unnecessarily cloning an array.␊ + ` + +## Invalid #8 + 1 | [...foo.splice(1)] + +> Output + + `␊ + 1 | foo.splice(1)␊ + ` + +> Error 1/1 + + `␊ + > 1 | [...foo.splice(1)]␊ + | ^^^^^^^^^^^^^^^^^^ Unnecessarily cloning an array.␊ + ` + +## Invalid #9 + 1 | [...foo.split("|")] + +> Output + + `␊ + 1 | foo.split("|")␊ + ` + +> Error 1/1 + + `␊ + > 1 | [...foo.split("|")]␊ + | ^^^^^^^^^^^^^^^^^^^ Unnecessarily cloning an array.␊ + ` + +## Invalid #10 + 1 | [...Object.keys(foo)] + +> Output + + `␊ + 1 | Object.keys(foo)␊ + ` + +> Error 1/1 + + `␊ + > 1 | [...Object.keys(foo)]␊ + | ^^^^^^^^^^^^^^^^^^^^^ Unnecessarily cloning an array.␊ + ` + +## Invalid #11 + 1 | [...Object.values(foo)] + +> Output + + `␊ + 1 | Object.values(foo)␊ + ` + +> Error 1/1 + + `␊ + > 1 | [...Object.values(foo)]␊ + | ^^^^^^^^^^^^^^^^^^^^^^^ Unnecessarily cloning an array.␊ + ` diff --git a/test/snapshots/no-useless-spread.mjs.snap b/test/snapshots/no-useless-spread.mjs.snap index 8d2ab2b2c85cec7a45b3f6d0e7cca8f03526506a..6a87c622ad06de46b4a29cb22a39985ca73a4fa4 100644 GIT binary patch literal 4982 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 Date: Sat, 19 Nov 2022 16:03:45 +0800 Subject: [PATCH 04/14] More test --- rules/no-useless-spread.js | 14 ++++---------- test/no-useless-spread.mjs | 8 +++++++- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/rules/no-useless-spread.js b/rules/no-useless-spread.js index 5ccd4f16ec..7302fbf741 100644 --- a/rules/no-useless-spread.js +++ b/rules/no-useless-spread.js @@ -105,6 +105,8 @@ function getCommaTokens(arrayExpression, sourceCode) { } function * unwrapSingleArraySpread(fixer, arrayExpression, sourceCode) { + yield * fixSpaceAroundKeyword(fixer, arrayExpression, sourceCode); + const [ openingBracketToken, spreadToken, @@ -229,13 +231,7 @@ const create = context => { node: arrayExpression, messageId, data: {parentDescription}, - * fix(fixer) { - if (parent.type === 'ForOfStatement') { - yield * fixSpaceAroundKeyword(fixer, arrayExpression, sourceCode); - } - - yield * unwrapSingleArraySpread(fixer, arrayExpression, sourceCode); - }, + fix: (fixer) => unwrapSingleArraySpread(fixer, arrayExpression, sourceCode), }; }, [uselessCloneImmediateArraySelector](node) { @@ -243,9 +239,7 @@ const create = context => { return { node: arrayExpression, messageId: CLONE_ARRAY, - * fix(fixer) { - yield * unwrapSingleArraySpread(fixer, arrayExpression, sourceCode); - }, + fix: (fixer) => unwrapSingleArraySpread(fixer, arrayExpression, sourceCode), } }, }; diff --git a/test/no-useless-spread.mjs b/test/no-useless-spread.mjs index 4dc2fdac4d..41c11f0928 100644 --- a/test/no-useless-spread.mjs +++ b/test/no-useless-spread.mjs @@ -242,7 +242,13 @@ test.snapshot({ // Cloning an immediate array test.snapshot({ - valid: [], + valid: [ + '[...not.array]', + '[...not.array()]', + '[...array.unknown()]', + '[...Object.notReturningArray(foo)]', + '[...NotObject.keys(foo)]', + ], invalid: [ '[...foo.concat(bar)]', '[...foo.copyWithin(-2)]', From 7ba1e33c50eeac2f1386c6f203a4386803d6667c Mon Sep 17 00:00:00 2001 From: fisker Date: Sat, 19 Nov 2022 16:05:52 +0800 Subject: [PATCH 05/14] Add test --- test/no-useless-spread.mjs | 12 +++++ test/snapshots/no-useless-spread.mjs.md | 52 ++++++++++++++++++++++ test/snapshots/no-useless-spread.mjs.snap | Bin 4982 -> 5133 bytes 3 files changed, 64 insertions(+) diff --git a/test/no-useless-spread.mjs b/test/no-useless-spread.mjs index 41c11f0928..3b72c81ca6 100644 --- a/test/no-useless-spread.mjs +++ b/test/no-useless-spread.mjs @@ -261,6 +261,18 @@ test.snapshot({ '[...foo.split("|")]', '[...Object.keys(foo)]', '[...Object.values(foo)]', + outdent` + function foo(bar) { + return[...Object.keys(bar)]; + } + `, + outdent` + function foo(bar) { + return[ + ...Object.keys(bar) + ]; + } + `, ], }); diff --git a/test/snapshots/no-useless-spread.mjs.md b/test/snapshots/no-useless-spread.mjs.md index c718d39865..ec4464bb7b 100644 --- a/test/snapshots/no-useless-spread.mjs.md +++ b/test/snapshots/no-useless-spread.mjs.md @@ -1729,3 +1729,55 @@ Generated by [AVA](https://avajs.dev). > 1 | [...Object.values(foo)]␊ | ^^^^^^^^^^^^^^^^^^^^^^^ Unnecessarily cloning an array.␊ ` + +## Invalid #12 + 1 | function foo(bar) { + 2 | return[...Object.keys(bar)]; + 3 | } + +> Output + + `␊ + 1 | function foo(bar) {␊ + 2 | return Object.keys(bar);␊ + 3 | }␊ + ` + +> Error 1/1 + + `␊ + 1 | function foo(bar) {␊ + > 2 | return[...Object.keys(bar)];␊ + | ^^^^^^^^^^^^^^^^^^^^^ Unnecessarily cloning an array.␊ + 3 | }␊ + ` + +## Invalid #13 + 1 | function foo(bar) { + 2 | return[ + 3 | ...Object.keys(bar) + 4 | ]; + 5 | } + +> Output + + `␊ + 1 | function foo(bar) {␊ + 2 | return ␊ + 3 | Object.keys(bar)␊ + 4 | ;␊ + 5 | }␊ + ` + +> Error 1/1 + + `␊ + 1 | function foo(bar) {␊ + > 2 | return[␊ + | ^␊ + > 3 | ...Object.keys(bar)␊ + | ^^^^^^^^^^^^^^^^^^^^^␊ + > 4 | ];␊ + | ^^^ Unnecessarily cloning an array.␊ + 5 | }␊ + ` diff --git a/test/snapshots/no-useless-spread.mjs.snap b/test/snapshots/no-useless-spread.mjs.snap index 6a87c622ad06de46b4a29cb22a39985ca73a4fa4..3f6d7b97f4909b25b761c7cae3ae27532bed9179 100644 GIT binary patch literal 5133 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 literal 4982 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 Date: Sat, 19 Nov 2022 16:15:56 +0800 Subject: [PATCH 06/14] Fix --- rules/no-useless-spread.js | 36 +++++++++-- test/snapshots/no-useless-spread.mjs.md | 72 +++++++++++++++++++++- test/snapshots/no-useless-spread.mjs.snap | Bin 5133 -> 5265 bytes 3 files changed, 102 insertions(+), 6 deletions(-) diff --git a/rules/no-useless-spread.js b/rules/no-useless-spread.js index 7302fbf741..d56f960f7c 100644 --- a/rules/no-useless-spread.js +++ b/rules/no-useless-spread.js @@ -6,7 +6,15 @@ const { methodCallSelector, } = require('./selectors/index.js'); const typedArray = require('./shared/typed-array.js'); -const {removeParentheses, fixSpaceAroundKeyword} = require('./fix/index.js'); +const { + removeParentheses, + fixSpaceAroundKeyword, + addParenthesizesToReturnOrThrowExpression, +} = require('./fix/index.js'); +const isOnSameLine = require('./utils/is-on-same-line.js'); +const { + isParenthesized, +} = require('./utils/parentheses.js'); const SPREAD_IN_LIST = 'spread-in-list'; const ITERABLE_TO_ARRAY = 'iterable-to-array'; @@ -105,12 +113,11 @@ function getCommaTokens(arrayExpression, sourceCode) { } function * unwrapSingleArraySpread(fixer, arrayExpression, sourceCode) { - yield * fixSpaceAroundKeyword(fixer, arrayExpression, sourceCode); - const [ openingBracketToken, spreadToken, - ] = sourceCode.getFirstTokens(arrayExpression, 2); + thirdToken, + ] = sourceCode.getFirstTokens(arrayExpression, 3); // `[...value]` // ^ @@ -134,6 +141,27 @@ function * unwrapSingleArraySpread(fixer, arrayExpression, sourceCode) { if (isCommaToken(commaToken)) { yield fixer.remove(commaToken); } + + /* + ```js + function foo() { + return [ + ...value, + ]; + } + ``` + */ + const {parent} = arrayExpression; + if ( + (parent.type === 'ReturnStatement' || parent.type === 'ThrowStatement') + && parent.argument === arrayExpression + && !isOnSameLine(openingBracketToken, thirdToken) + && !isParenthesized(arrayExpression, sourceCode) + ) { + yield * addParenthesizesToReturnOrThrowExpression(fixer, parent, sourceCode); + } else { + yield * fixSpaceAroundKeyword(fixer, arrayExpression, sourceCode); + } } /** @param {import('eslint').Rule.RuleContext} context */ diff --git a/test/snapshots/no-useless-spread.mjs.md b/test/snapshots/no-useless-spread.mjs.md index ec4464bb7b..56305a6800 100644 --- a/test/snapshots/no-useless-spread.mjs.md +++ b/test/snapshots/no-useless-spread.mjs.md @@ -1763,9 +1763,9 @@ Generated by [AVA](https://avajs.dev). `␊ 1 | function foo(bar) {␊ - 2 | return ␊ + 2 | return (␊ 3 | Object.keys(bar)␊ - 4 | ;␊ + 4 | );␊ 5 | }␊ ` @@ -1781,3 +1781,71 @@ Generated by [AVA](https://avajs.dev). | ^^^ Unnecessarily cloning an array.␊ 5 | }␊ ` + +## Invalid #14 + 1 | function foo(bar) { + 2 | return[ + 3 | ...( + 4 | Object.keys(bar) + 5 | ) + 6 | ]; + 7 | } + +> Output + + `␊ + 1 | function foo(bar) {␊ + 2 | return (␊ + 3 | (␊ + 4 | Object.keys(bar)␊ + 5 | )␊ + 6 | );␊ + 7 | }␊ + ` + +> Error 1/1 + + `␊ + 1 | function foo(bar) {␊ + > 2 | return[␊ + | ^␊ + > 3 | ...(␊ + | ^^^^^^␊ + > 4 | Object.keys(bar)␊ + | ^^^^^^␊ + > 5 | )␊ + | ^^^^^^␊ + > 6 | ];␊ + | ^^^ Unnecessarily cloning an array.␊ + 7 | }␊ + ` + +## Invalid #15 + 1 | function foo(bar) { + 2 | return([ + 3 | ...Object.keys(bar) + 4 | ]); + 5 | } + +> Output + + `␊ + 1 | function foo(bar) {␊ + 2 | return (␊ + 3 | Object.keys(bar)␊ + 4 | );␊ + 5 | }␊ + ` + +> Error 1/1 + + `␊ + 1 | function foo(bar) {␊ + > 2 | return([␊ + | ^␊ + > 3 | ...Object.keys(bar)␊ + | ^^^^^^^^^^^^^^^^^^^^^␊ + > 4 | ]);␊ + | ^^^ Unnecessarily cloning an array.␊ + 5 | }␊ + ` diff --git a/test/snapshots/no-useless-spread.mjs.snap b/test/snapshots/no-useless-spread.mjs.snap index 3f6d7b97f4909b25b761c7cae3ae27532bed9179..0933d32ab5ba2ac995210b8d62fd151cc476bdfa 100644 GIT binary patch literal 5265 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 X##$KRlolIYWflJ)r;S~wz+M0V1{^Oe literal 5133 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 From 33eb3c8370e8ed16a343289acc4c7de5ee1b7da9 Mon Sep 17 00:00:00 2001 From: fisker Date: Sat, 19 Nov 2022 16:19:21 +0800 Subject: [PATCH 07/14] More test --- rules/no-useless-spread.js | 4 ++-- test/no-useless-spread.mjs | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/rules/no-useless-spread.js b/rules/no-useless-spread.js index d56f960f7c..1c92a3a4a4 100644 --- a/rules/no-useless-spread.js +++ b/rules/no-useless-spread.js @@ -221,8 +221,8 @@ const create = context => { continue; } - // `call([foo, , bar])` - // ^ Replace holes with `undefined` + // `call(...[foo, , bar])` + // ^ Replace holes with `undefined` yield fixer.insertTextBefore(commaToken, 'undefined'); } }, diff --git a/test/no-useless-spread.mjs b/test/no-useless-spread.mjs index 3b72c81ca6..7ef2620763 100644 --- a/test/no-useless-spread.mjs +++ b/test/no-useless-spread.mjs @@ -273,6 +273,22 @@ test.snapshot({ ]; } `, + outdent` + function foo(bar) { + return[ + ...( + Object.keys(bar) + ) + ]; + } + `, + outdent` + function foo(bar) { + return([ + ...Object.keys(bar) + ]); + } + `, ], }); From 8fed9ff65cf7b1468d40de3b10cdcce0b7bdab79 Mon Sep 17 00:00:00 2001 From: fisker Date: Sat, 19 Nov 2022 16:23:39 +0800 Subject: [PATCH 08/14] Update docs --- docs/rules/no-useless-spread.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/rules/no-useless-spread.md b/docs/rules/no-useless-spread.md index d314de2d88..05621d8a5b 100644 --- a/docs/rules/no-useless-spread.md +++ b/docs/rules/no-useless-spread.md @@ -12,6 +12,7 @@ - Spread an array literal as elements of an array literal - Spread an array literal as arguments of a call or a `new` call - Spread an object literal as properties of an object literal + - Use spread syntax to clone an immediate array - The following builtins accept an iterable, so it's unnecessary to convert the iterable to an array: @@ -65,6 +66,14 @@ function * foo() { } ``` +```js +function foo(bar) { + return [ + ...bar.map(x => x * 2), + ]; +} +``` + ## Pass ```js @@ -116,3 +125,9 @@ function * foo() { yield * anotherGenerator(); } ``` + +```js +function foo(bar) { + return bar.map(x => x * 2); +} +``` From cabfbf97f4228ef62a52139854d417a845826495 Mon Sep 17 00:00:00 2001 From: fisker Date: Sat, 19 Nov 2022 16:39:52 +0800 Subject: [PATCH 09/14] More array --- rules/no-useless-spread.js | 16 +++- test/no-useless-spread.mjs | 11 +++ test/snapshots/no-useless-spread.mjs.md | 86 +++++++++++++++++++++- test/snapshots/no-useless-spread.mjs.snap | Bin 5265 -> 5471 bytes 4 files changed, 109 insertions(+), 4 deletions(-) diff --git a/rules/no-useless-spread.js b/rules/no-useless-spread.js index 1c92a3a4a4..ac4c5c2f0a 100644 --- a/rules/no-useless-spread.js +++ b/rules/no-useless-spread.js @@ -82,7 +82,21 @@ const uselessCloneImmediateArraySelector = [ // `String#split()` methodCallSelector('split'), // `Object.keys()` and `Object.values()` - methodCallSelector({object: 'Object', methods: ['keys', 'values']}), + methodCallSelector({object: 'Object', methods: ['keys', 'values'], argumentsLength: 1}), + // `await Promise.all()` and `await Promise.allSettled` + [ + 'AwaitExpression', + methodCallSelector({ + object: 'Promise', + methods: ['all', 'allSettled'], + argumentsLength: 1, + path: 'argument', + }), + ].join(''), + // `Array.from()`, `Array.of()` + methodCallSelector({object: 'Array', methods: ['from', 'of']}), + // `new Array` + newExpressionSelector('Array'), ]), ].join(''); diff --git a/test/no-useless-spread.mjs b/test/no-useless-spread.mjs index 7ef2620763..981ea530a1 100644 --- a/test/no-useless-spread.mjs +++ b/test/no-useless-spread.mjs @@ -248,6 +248,12 @@ test.snapshot({ '[...array.unknown()]', '[...Object.notReturningArray(foo)]', '[...NotObject.keys(foo)]', + '[...Int8Array.from(foo)]', + '[...Int8Array.of()]', + '[...new Int8Array(3)]', + '[...Promise.all(foo)]', + '[...Promise.allSettled(foo)]', + '[...await Promise.all(foo, extraArgument)]', ], invalid: [ '[...foo.concat(bar)]', @@ -261,6 +267,11 @@ test.snapshot({ '[...foo.split("|")]', '[...Object.keys(foo)]', '[...Object.values(foo)]', + '[...Array.from(foo)]', + '[...Array.of()]', + '[...new Array(3)]', + '[...await Promise.all(foo)]', + '[...await Promise.allSettled(foo)]', outdent` function foo(bar) { return[...Object.keys(bar)]; diff --git a/test/snapshots/no-useless-spread.mjs.md b/test/snapshots/no-useless-spread.mjs.md index 56305a6800..672be64118 100644 --- a/test/snapshots/no-useless-spread.mjs.md +++ b/test/snapshots/no-useless-spread.mjs.md @@ -1731,6 +1731,86 @@ Generated by [AVA](https://avajs.dev). ` ## Invalid #12 + 1 | [...Array.from(foo)] + +> Output + + `␊ + 1 | Array.from(foo)␊ + ` + +> Error 1/1 + + `␊ + > 1 | [...Array.from(foo)]␊ + | ^^^^^^^^^^^^^^^^^^^^ Unnecessarily cloning an array.␊ + ` + +## Invalid #13 + 1 | [...Array.of()] + +> Output + + `␊ + 1 | Array.of()␊ + ` + +> Error 1/1 + + `␊ + > 1 | [...Array.of()]␊ + | ^^^^^^^^^^^^^^^ Unnecessarily cloning an array.␊ + ` + +## Invalid #14 + 1 | [...new Array(3)] + +> Output + + `␊ + 1 | new Array(3)␊ + ` + +> Error 1/1 + + `␊ + > 1 | [...new Array(3)]␊ + | ^^^^^^^^^^^^^^^^^ Unnecessarily cloning an array.␊ + ` + +## Invalid #15 + 1 | [...await Promise.all(foo)] + +> Output + + `␊ + 1 | await Promise.all(foo)␊ + ` + +> Error 1/1 + + `␊ + > 1 | [...await Promise.all(foo)]␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Unnecessarily cloning an array.␊ + ` + +## Invalid #16 + 1 | [...await Promise.allSettled(foo)] + +> Output + + `␊ + 1 | await Promise.allSettled(foo)␊ + ` + +> Error 1/1 + + `␊ + > 1 | [...await Promise.allSettled(foo)]␊ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Unnecessarily cloning an array.␊ + ` + +## Invalid #17 1 | function foo(bar) { 2 | return[...Object.keys(bar)]; 3 | } @@ -1752,7 +1832,7 @@ Generated by [AVA](https://avajs.dev). 3 | }␊ ` -## Invalid #13 +## Invalid #18 1 | function foo(bar) { 2 | return[ 3 | ...Object.keys(bar) @@ -1782,7 +1862,7 @@ Generated by [AVA](https://avajs.dev). 5 | }␊ ` -## Invalid #14 +## Invalid #19 1 | function foo(bar) { 2 | return[ 3 | ...( @@ -1820,7 +1900,7 @@ Generated by [AVA](https://avajs.dev). 7 | }␊ ` -## Invalid #15 +## Invalid #20 1 | function foo(bar) { 2 | return([ 3 | ...Object.keys(bar) diff --git a/test/snapshots/no-useless-spread.mjs.snap b/test/snapshots/no-useless-spread.mjs.snap index 0933d32ab5ba2ac995210b8d62fd151cc476bdfa..76b405a9b868e62d5c647610e61c86f663c014f1 100644 GIT binary patch literal 5471 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 VR*OrT?QosP?|%;|5NShV008PZyI24K literal 5265 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 X##$KRlolIYWflJ)r;S~wz+M0V1{^Oe From 52a88b0b8882ef22a4f9a2b1411a29dd78920b99 Mon Sep 17 00:00:00 2001 From: fisker Date: Sat, 19 Nov 2022 16:47:59 +0800 Subject: [PATCH 10/14] Linting --- rules/no-useless-spread.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rules/no-useless-spread.js b/rules/no-useless-spread.js index ac4c5c2f0a..7b780a2f5f 100644 --- a/rules/no-useless-spread.js +++ b/rules/no-useless-spread.js @@ -20,13 +20,13 @@ const SPREAD_IN_LIST = 'spread-in-list'; const ITERABLE_TO_ARRAY = 'iterable-to-array'; const ITERABLE_TO_ARRAY_IN_FOR_OF = 'iterable-to-array-in-for-of'; const ITERABLE_TO_ARRAY_IN_YIELD_STAR = 'iterable-to-array-in-yield-star'; -const CLONE_ARRAY = "clone-array"; +const CLONE_ARRAY = 'clone-array'; const messages = { [SPREAD_IN_LIST]: 'Spread an {{argumentType}} literal in {{parentDescription}} is unnecessary.', [ITERABLE_TO_ARRAY]: '`{{parentDescription}}` accepts iterable as argument, it\'s unnecessary to convert to an array.', [ITERABLE_TO_ARRAY_IN_FOR_OF]: '`for…of` can iterate over iterable, it\'s unnecessary to convert to an array.', [ITERABLE_TO_ARRAY_IN_YIELD_STAR]: '`yield*` can delegate iterable, it\'s unnecessary to convert to an array.', - [CLONE_ARRAY]: 'Unnecessarily cloning an array.' + [CLONE_ARRAY]: 'Unnecessarily cloning an array.', }; const uselessSpreadInListSelector = matches([ @@ -273,7 +273,7 @@ const create = context => { node: arrayExpression, messageId, data: {parentDescription}, - fix: (fixer) => unwrapSingleArraySpread(fixer, arrayExpression, sourceCode), + fix: fixer => unwrapSingleArraySpread(fixer, arrayExpression, sourceCode), }; }, [uselessCloneImmediateArraySelector](node) { @@ -281,8 +281,8 @@ const create = context => { return { node: arrayExpression, messageId: CLONE_ARRAY, - fix: (fixer) => unwrapSingleArraySpread(fixer, arrayExpression, sourceCode), - } + fix: fixer => unwrapSingleArraySpread(fixer, arrayExpression, sourceCode), + }; }, }; }; From 0e8eabbd336c09df487afe52d3e1945936fefdfb Mon Sep 17 00:00:00 2001 From: fisker Date: Sat, 19 Nov 2022 16:49:31 +0800 Subject: [PATCH 11/14] Linting --- rules/no-useless-spread.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rules/no-useless-spread.js b/rules/no-useless-spread.js index 7b780a2f5f..a992f53734 100644 --- a/rules/no-useless-spread.js +++ b/rules/no-useless-spread.js @@ -173,9 +173,10 @@ function * unwrapSingleArraySpread(fixer, arrayExpression, sourceCode) { && !isParenthesized(arrayExpression, sourceCode) ) { yield * addParenthesizesToReturnOrThrowExpression(fixer, parent, sourceCode); - } else { - yield * fixSpaceAroundKeyword(fixer, arrayExpression, sourceCode); + return; } + + yield * fixSpaceAroundKeyword(fixer, arrayExpression, sourceCode); } /** @param {import('eslint').Rule.RuleContext} context */ From aa92c024d23f937e6925febade3c056ad564c7b9 Mon Sep 17 00:00:00 2001 From: fisker Date: Sat, 19 Nov 2022 16:53:20 +0800 Subject: [PATCH 12/14] Comment --- rules/no-useless-spread.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/no-useless-spread.js b/rules/no-useless-spread.js index a992f53734..1342cc7712 100644 --- a/rules/no-useless-spread.js +++ b/rules/no-useless-spread.js @@ -95,7 +95,7 @@ const uselessCloneImmediateArraySelector = [ ].join(''), // `Array.from()`, `Array.of()` methodCallSelector({object: 'Array', methods: ['from', 'of']}), - // `new Array` + // `new Array()` newExpressionSelector('Array'), ]), ].join(''); From 37026673669c61032e886146f0dd3e275fc3c096 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Sun, 20 Nov 2022 23:39:13 +0800 Subject: [PATCH 13/14] Update docs/rules/no-useless-spread.md Co-authored-by: Sindre Sorhus --- docs/rules/no-useless-spread.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/rules/no-useless-spread.md b/docs/rules/no-useless-spread.md index 05621d8a5b..73b1099ad7 100644 --- a/docs/rules/no-useless-spread.md +++ b/docs/rules/no-useless-spread.md @@ -12,7 +12,7 @@ - Spread an array literal as elements of an array literal - Spread an array literal as arguments of a call or a `new` call - Spread an object literal as properties of an object literal - - Use spread syntax to clone an immediate array + - Use spread syntax to clone an array created inline - The following builtins accept an iterable, so it's unnecessary to convert the iterable to an array: From 671533ca9dedadaf5aba02b01ca21a22755b933b Mon Sep 17 00:00:00 2001 From: fisker Date: Sun, 20 Nov 2022 23:41:01 +0800 Subject: [PATCH 14/14] Rename variable --- rules/no-useless-spread.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/no-useless-spread.js b/rules/no-useless-spread.js index 1342cc7712..ad363b3e96 100644 --- a/rules/no-useless-spread.js +++ b/rules/no-useless-spread.js @@ -65,7 +65,7 @@ const uselessIterableToArraySelector = matches([ `YieldExpression[delegate=true] > ${singleArraySpreadSelector}.argument`, ]); -const uselessCloneImmediateArraySelector = [ +const uselessArrayCloneSelector = [ `${singleArraySpreadSelector} > .elements:first-child > .argument`, matches([ // Array methods returns a new array @@ -277,7 +277,7 @@ const create = context => { fix: fixer => unwrapSingleArraySpread(fixer, arrayExpression, sourceCode), }; }, - [uselessCloneImmediateArraySelector](node) { + [uselessArrayCloneSelector](node) { const arrayExpression = node.parent.parent; return { node: arrayExpression,