From 59218e3cd653fdf9ad7e7f5d2666e8c2fa775601 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Wed, 6 Apr 2022 23:13:06 +0800 Subject: [PATCH] `no-array-for-each`: Add fix for arrow function body (#1785) --- rules/ast/index.js | 1 + rules/ast/is-arrow-function-body.js | 7 + rules/no-array-for-each.js | 26 ++- test/no-array-for-each.mjs | 11 ++ test/snapshots/no-array-for-each.mjs.md | 194 ++++++++++++++++++++++ test/snapshots/no-array-for-each.mjs.snap | Bin 9988 -> 10590 bytes 6 files changed, 231 insertions(+), 8 deletions(-) create mode 100644 rules/ast/is-arrow-function-body.js diff --git a/rules/ast/index.js b/rules/ast/index.js index 10cb02152d..dde44bd59e 100644 --- a/rules/ast/index.js +++ b/rules/ast/index.js @@ -1,4 +1,5 @@ 'use strict'; module.exports = { + isArrowFunctionBody: require('./is-arrow-function-body.js'), isEmptyNode: require('./is-empty-node.js'), }; diff --git a/rules/ast/is-arrow-function-body.js b/rules/ast/is-arrow-function-body.js new file mode 100644 index 0000000000..966de0d59e --- /dev/null +++ b/rules/ast/is-arrow-function-body.js @@ -0,0 +1,7 @@ +'use strict'; + +function isArrowFunctionBody(node) { + return node.parent.type === 'ArrowFunctionExpression' && node.parent.body === node; +} + +module.exports = isArrowFunctionBody; diff --git a/rules/no-array-for-each.js b/rules/no-array-for-each.js index 6aabcd084b..5472170ba6 100644 --- a/rules/no-array-for-each.js +++ b/rules/no-array-for-each.js @@ -18,6 +18,7 @@ const isFunctionSelfUsedInside = require('./utils/is-function-self-used-inside.j const {isNodeMatches} = require('./utils/is-node-matches.js'); const assertToken = require('./utils/assert-token.js'); const {fixSpaceAroundKeyword, removeParentheses} = require('./fix/index.js'); +const {isArrowFunctionBody} = require('./ast/index.js'); const MESSAGE_ID_ERROR = 'no-array-for-each/error'; const MESSAGE_ID_SUGGESTION = 'no-array-for-each/suggestion'; @@ -83,7 +84,7 @@ function getFixFunction(callExpression, functionInfo, context) { const iterableObject = callExpression.callee.object; const {returnStatements} = functionInfo.get(callback); const isOptionalObject = callExpression.callee.optional; - const expressionStatement = stripChainExpression(callExpression).parent; + const ancestor = stripChainExpression(callExpression).parent; const objectText = sourceCode.getText(iterableObject); const getForOfLoopHeadText = () => { @@ -247,12 +248,17 @@ function getFixFunction(callExpression, functionInfo, context) { yield * replaceReturnStatement(returnStatement, fixer); } - const expressionStatementLastToken = sourceCode.getLastToken(expressionStatement); - // Remove semicolon if it's not needed anymore - // foo.forEach(bar => {}); - // ^ - if (shouldRemoveExpressionStatementLastToken(expressionStatementLastToken)) { - yield fixer.remove(expressionStatementLastToken, fixer); + if (ancestor.type === 'ExpressionStatement') { + const expressionStatementLastToken = sourceCode.getLastToken(ancestor); + // Remove semicolon if it's not needed anymore + // foo.forEach(bar => {}); + // ^ + if (shouldRemoveExpressionStatementLastToken(expressionStatementLastToken)) { + yield fixer.remove(expressionStatementLastToken, fixer); + } + } else if (ancestor.type === 'ArrowFunctionExpression') { + yield fixer.insertTextBefore(callExpression, '{ '); + yield fixer.insertTextAfter(callExpression, ' }'); } yield * fixSpaceAroundKeyword(fixer, callExpression.parent, sourceCode); @@ -332,7 +338,11 @@ function isFixable(callExpression, {scope, functionInfo, allIdentifiers, context } // Check ancestors, we only fix `ExpressionStatement` - if (stripChainExpression(callExpression).parent.type !== 'ExpressionStatement') { + const callOrChainExpression = stripChainExpression(callExpression); + if ( + callOrChainExpression.parent.type !== 'ExpressionStatement' + && !isArrowFunctionBody(callOrChainExpression) + ) { return false; } diff --git a/test/no-array-for-each.mjs b/test/no-array-for-each.mjs index 670ef4bdbd..7315dcde3d 100644 --- a/test/no-array-for-each.mjs +++ b/test/no-array-for-each.mjs @@ -425,10 +425,21 @@ test.snapshot({ // Need insert space after keyword 'if (true) {} else[foo].forEach((element) => {})', + + // Arrow function body + 'const a = () => (( foo.forEach(element => bar(element)) ))', + 'const a = () => (( foo.forEach(element => bar(element)) ));', + 'const a = () => foo.forEach(element => bar(element))', + 'const a = () => foo.forEach(element => bar(element));', + 'const a = () => void foo.forEach(element => bar(element));', ].flatMap(code => [code, code.replace('.forEach', '?.forEach')]), // Should not fix to invalid code '1?.forEach((a, b) => call(a, b))', + + // Arrow function body + 'array.forEach((arrayInArray) => arrayInArray.forEach(element => bar(element)));', + 'array.forEach((arrayInArray) => arrayInArray?.forEach(element => bar(element)));', ], }); diff --git a/test/snapshots/no-array-for-each.mjs.md b/test/snapshots/no-array-for-each.mjs.md index 44728824c5..0f5c387a36 100644 --- a/test/snapshots/no-array-for-each.mjs.md +++ b/test/snapshots/no-array-for-each.mjs.md @@ -3897,6 +3897,154 @@ Generated by [AVA](https://avajs.dev). ` ## Invalid #216 + 1 | const a = () => (( foo.forEach(element => bar(element)) )) + +> Output + + `␊ + 1 | const a = () => { for (const element of foo) bar(element) } ␊ + ` + +> Error 1/1 + + `␊ + > 1 | const a = () => (( foo.forEach(element => bar(element)) ))␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + ` + +## Invalid #217 + 1 | const a = () => (( foo?.forEach(element => bar(element)) )) + +> Output + + `␊ + 1 | const a = () => { if (foo) for (const element of foo) bar(element) } ␊ + ` + +> Error 1/1 + + `␊ + > 1 | const a = () => (( foo?.forEach(element => bar(element)) ))␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + ` + +## Invalid #218 + 1 | const a = () => (( foo.forEach(element => bar(element)) )); + +> Output + + `␊ + 1 | const a = () => { for (const element of foo) bar(element) } ;␊ + ` + +> Error 1/1 + + `␊ + > 1 | const a = () => (( foo.forEach(element => bar(element)) ));␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + ` + +## Invalid #219 + 1 | const a = () => (( foo?.forEach(element => bar(element)) )); + +> Output + + `␊ + 1 | const a = () => { if (foo) for (const element of foo) bar(element) } ;␊ + ` + +> Error 1/1 + + `␊ + > 1 | const a = () => (( foo?.forEach(element => bar(element)) ));␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + ` + +## Invalid #220 + 1 | const a = () => foo.forEach(element => bar(element)) + +> Output + + `␊ + 1 | const a = () => { for (const element of foo) bar(element) }␊ + ` + +> Error 1/1 + + `␊ + > 1 | const a = () => foo.forEach(element => bar(element))␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + ` + +## Invalid #221 + 1 | const a = () => foo?.forEach(element => bar(element)) + +> Output + + `␊ + 1 | const a = () => { if (foo) for (const element of foo) bar(element) }␊ + ` + +> Error 1/1 + + `␊ + > 1 | const a = () => foo?.forEach(element => bar(element))␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + ` + +## Invalid #222 + 1 | const a = () => foo.forEach(element => bar(element)); + +> Output + + `␊ + 1 | const a = () => { for (const element of foo) bar(element) };␊ + ` + +> Error 1/1 + + `␊ + > 1 | const a = () => foo.forEach(element => bar(element));␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + ` + +## Invalid #223 + 1 | const a = () => foo?.forEach(element => bar(element)); + +> Output + + `␊ + 1 | const a = () => { if (foo) for (const element of foo) bar(element) };␊ + ` + +> Error 1/1 + + `␊ + > 1 | const a = () => foo?.forEach(element => bar(element));␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + ` + +## Invalid #224 + 1 | const a = () => void foo.forEach(element => bar(element)); + +> Error 1/1 + + `␊ + > 1 | const a = () => void foo.forEach(element => bar(element));␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + ` + +## Invalid #225 + 1 | const a = () => void foo?.forEach(element => bar(element)); + +> Error 1/1 + + `␊ + > 1 | const a = () => void foo?.forEach(element => bar(element));␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + ` + +## Invalid #226 1 | 1?.forEach((a, b) => call(a, b)) > Output @@ -3911,3 +4059,49 @@ Generated by [AVA](https://avajs.dev). > 1 | 1?.forEach((a, b) => call(a, b))␊ | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ ` + +## Invalid #227 + 1 | array.forEach((arrayInArray) => arrayInArray.forEach(element => bar(element))); + +> Output + + `␊ + 1 | for (const arrayInArray of array) for (const element of arrayInArray) bar(element);␊ + ` + +> Error 1/2 + + `␊ + > 1 | array.forEach((arrayInArray) => arrayInArray.forEach(element => bar(element)));␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + ` + +> Error 2/2 + + `␊ + > 1 | array.forEach((arrayInArray) => arrayInArray.forEach(element => bar(element)));␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + ` + +## Invalid #228 + 1 | array.forEach((arrayInArray) => arrayInArray?.forEach(element => bar(element))); + +> Output + + `␊ + 1 | for (const arrayInArray of array) if (arrayInArray) for (const element of arrayInArray) bar(element);␊ + ` + +> Error 1/2 + + `␊ + > 1 | array.forEach((arrayInArray) => arrayInArray?.forEach(element => bar(element)));␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + ` + +> Error 2/2 + + `␊ + > 1 | array.forEach((arrayInArray) => arrayInArray?.forEach(element => bar(element)));␊ + | ^^^^^^^ Use \`for…of\` instead of \`.forEach(…)\`.␊ + ` diff --git a/test/snapshots/no-array-for-each.mjs.snap b/test/snapshots/no-array-for-each.mjs.snap index 91e2006dc0735301b4d84f19b7346ad86d07fb9d..bb6d19fb00ff284559c90187c08ab9b389cc137b 100644 GIT binary patch literal 10590 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 literal 9988 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 Ow*DW`Vr+5%*8l)4^Kni9