From e615a3760ca4d5103ee171572c6a95ea3479dbe5 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Thu, 31 Mar 2022 03:09:31 +0800 Subject: [PATCH] `no-array-for-each`: Handle `ChainExpression` correctly (#1772) --- rules/no-array-for-each.js | 14 ++- test/no-array-for-each.mjs | 2 + test/snapshots/no-array-for-each.mjs.md | 140 +++++++++++++--------- test/snapshots/no-array-for-each.mjs.snap | Bin 5185 -> 5271 bytes 4 files changed, 95 insertions(+), 61 deletions(-) diff --git a/rules/no-array-for-each.js b/rules/no-array-for-each.js index ac5127de09..74e6cb8e02 100644 --- a/rules/no-array-for-each.js +++ b/rules/no-array-for-each.js @@ -302,6 +302,14 @@ function isFunctionParameterVariableReassigned(callbackFunction, context) { }); } +const isExpressionStatement = node => { + if (node.type === 'ChainExpression') { + node = node.parent; + } + + return node.type === 'ExpressionStatement'; +}; + function isFixable(callExpression, {scope, functionInfo, allIdentifiers, context}) { const sourceCode = context.getSourceCode(); // Check `CallExpression` @@ -313,14 +321,12 @@ function isFixable(callExpression, {scope, functionInfo, allIdentifiers, context return false; } - // Check `CallExpression.parent` - if (callExpression.parent.type !== 'ExpressionStatement') { + // Check ancestors, we only fix `ExpressionStatement` + if (!isExpressionStatement(callExpression.parent)) { return false; } // Check `CallExpression.callee` - // Because of `ChainExpression` wrapper, `foo?.forEach()` is already failed on previous check keep this just for safety - /* c8 ignore next 3 */ if (callExpression.callee.optional) { return false; } diff --git a/test/no-array-for-each.mjs b/test/no-array-for-each.mjs index 50e1c6876e..e3df34b062 100644 --- a/test/no-array-for-each.mjs +++ b/test/no-array-for-each.mjs @@ -196,6 +196,7 @@ test.snapshot({ bar(arguments) }) `, + 'a = foo?.bar.forEach((element) => bar(element));', // Auto-fix outdent` @@ -230,6 +231,7 @@ test.snapshot({ }); `, 'foo.forEach((element, index) => bar(element, index));', + 'foo?.bar.forEach((element) => bar(element));', // Array is parenthesized '(foo).forEach((element, index) => bar(element, index))', '(0, foo).forEach((element, index) => bar(element, index))', diff --git a/test/snapshots/no-array-for-each.mjs.md b/test/snapshots/no-array-for-each.mjs.md index a959a56049..e1c0d5eff6 100644 --- a/test/snapshots/no-array-for-each.mjs.md +++ b/test/snapshots/no-array-for-each.mjs.md @@ -674,6 +674,16 @@ Generated by [AVA](https://avajs.dev). ` ## Invalid #43 + 1 | a = foo?.bar.forEach((element) => bar(element)); + +> Error 1/1 + + `␊ + > 1 | a = foo?.bar.forEach((element) => bar(element));␊ + | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ + ` + +## Invalid #44 1 | foo.forEach(function (element) { 2 | bar(element); 3 | }); @@ -695,7 +705,7 @@ Generated by [AVA](https://avajs.dev). 3 | });␊ ` -## Invalid #44 +## Invalid #45 1 | foo.forEach(function withName(element) { 2 | bar(element); 3 | }); @@ -717,7 +727,7 @@ Generated by [AVA](https://avajs.dev). 3 | });␊ ` -## Invalid #45 +## Invalid #46 1 | foo.forEach((element) => { 2 | bar(element); 3 | }); @@ -739,7 +749,7 @@ Generated by [AVA](https://avajs.dev). 3 | });␊ ` -## Invalid #46 +## Invalid #47 1 | foo.forEach((element) => bar(element)); > Output @@ -755,7 +765,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #47 +## Invalid #48 1 | foo.forEach(function (element, index) { 2 | bar(element, index); 3 | }); @@ -777,7 +787,7 @@ Generated by [AVA](https://avajs.dev). 3 | });␊ ` -## Invalid #48 +## Invalid #49 1 | foo.forEach(function withName(element, index) { 2 | bar(element, index); 3 | }); @@ -799,7 +809,7 @@ Generated by [AVA](https://avajs.dev). 3 | });␊ ` -## Invalid #49 +## Invalid #50 1 | foo.forEach((element, index) => { 2 | bar(element, index); 3 | }); @@ -821,7 +831,7 @@ Generated by [AVA](https://avajs.dev). 3 | });␊ ` -## Invalid #50 +## Invalid #51 1 | foo.forEach((element, index) => bar(element, index)); > Output @@ -837,7 +847,23 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #51 +## Invalid #52 + 1 | foo?.bar.forEach((element) => bar(element)); + +> Output + + `␊ + 1 | for (const element of foo?.bar) bar(element);␊ + ` + +> Error 1/1 + + `␊ + > 1 | foo?.bar.forEach((element) => bar(element));␊ + | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ + ` + +## Invalid #53 1 | (foo).forEach((element, index) => bar(element, index)) > Output @@ -853,7 +879,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #52 +## Invalid #54 1 | (0, foo).forEach((element, index) => bar(element, index)) > Output @@ -869,7 +895,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #53 +## Invalid #55 1 | foo.forEach(function (element) { 2 | bar(element); 3 | },); @@ -891,7 +917,7 @@ Generated by [AVA](https://avajs.dev). 3 | },);␊ ` -## Invalid #54 +## Invalid #56 1 | foo.forEach(function withName(element) { 2 | bar(element); 3 | },); @@ -913,7 +939,7 @@ Generated by [AVA](https://avajs.dev). 3 | },);␊ ` -## Invalid #55 +## Invalid #57 1 | foo.forEach((element) => { 2 | bar(element); 3 | },); @@ -935,7 +961,7 @@ Generated by [AVA](https://avajs.dev). 3 | },);␊ ` -## Invalid #56 +## Invalid #58 1 | foo.forEach((element) => bar(element),); > Output @@ -951,7 +977,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #57 +## Invalid #59 1 | foo.forEach((element) => bar(element)) 2 | ;[foo].pop(); @@ -970,7 +996,7 @@ Generated by [AVA](https://avajs.dev). 2 | ;[foo].pop();␊ ` -## Invalid #58 +## Invalid #60 1 | foo.forEach((element) => { 2 | bar(element); 3 | }); @@ -1007,7 +1033,7 @@ Generated by [AVA](https://avajs.dev). 8 | }␊ ` -## Invalid #59 +## Invalid #61 1 | foo.forEach(element => ({})) > Output @@ -1023,7 +1049,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #60 +## Invalid #62 1 | foo.forEach((((((element => bar(element))))))); > Output @@ -1039,7 +1065,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #61 +## Invalid #63 1 | foo.forEach((element) => { 2 | if (1) { 3 | return; @@ -1175,7 +1201,7 @@ Generated by [AVA](https://avajs.dev). 41 | });␊ ` -## Invalid #62 +## Invalid #64 1 | node.children.index.forEach((children, index) => process(children, index)) > Output @@ -1191,7 +1217,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #63 +## Invalid #65 1 | (node?.children?.index).forEach((children, index) => process(children, index)) > Output @@ -1207,7 +1233,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #64 +## Invalid #66 1 | node[children].index.forEach((children, index) => process(children, index)) > Error 1/1 @@ -1217,7 +1243,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #65 +## Invalid #67 1 | (node.children?.[index]).forEach((children, index) => process(children, index)) > Error 1/1 @@ -1227,7 +1253,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #66 +## Invalid #68 1 | [{children: 1, index: 1}].forEach((children, index) => process(children, index)) > Output @@ -1243,7 +1269,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #67 +## Invalid #69 1 | [{[children]: 1, index: 1}].forEach((children, index) => process(children, index)) > Error 1/1 @@ -1253,7 +1279,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #68 +## Invalid #70 1 | [{[children]: 1, [index]: 1}].forEach((children, index) => process(children, index)) > Error 1/1 @@ -1263,7 +1289,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #69 +## Invalid #71 1 | [{children, index: 1}].forEach((children, index) => process(children, index)) > Error 1/1 @@ -1273,7 +1299,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #70 +## Invalid #72 1 | [{children: 1, index}].forEach((children, index) => process(children, index)) > Error 1/1 @@ -1283,7 +1309,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #71 +## Invalid #73 1 | [function name() {}].forEach((name, index) => process(name, index)) > Output @@ -1299,7 +1325,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #72 +## Invalid #74 1 | [ 2 | function () { 3 | function index() {} @@ -1327,7 +1353,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #73 +## Invalid #75 1 | [ 2 | function () { 3 | class index {} @@ -1355,7 +1381,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #74 +## Invalid #76 1 | [class Foo{}].forEach((Foo, index) => process(Foo, index)) > Output @@ -1371,7 +1397,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #75 +## Invalid #77 1 | [class Foo{}].forEach((X, Foo) => process(X, Foo)) > Output @@ -1387,7 +1413,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #76 +## Invalid #78 1 | [ 2 | class Foo { 3 | bar() {} @@ -1415,7 +1441,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #77 +## Invalid #79 1 | foo.React.Children.forEach(bar) > Error 1/1 @@ -1425,7 +1451,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #78 +## Invalid #80 1 | NotReact.Children.forEach(bar) > Error 1/1 @@ -1435,7 +1461,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #79 +## Invalid #81 1 | React.NotChildren.forEach(bar) > Error 1/1 @@ -1445,7 +1471,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #80 +## Invalid #82 1 | React?.Children.forEach(bar) > Error 1/1 @@ -1455,7 +1481,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #81 +## Invalid #83 1 | NotChildren.forEach(bar) > Error 1/1 @@ -1465,7 +1491,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #82 +## Invalid #84 1 | foo.forEach(element => { 2 | element ++; 3 | }) @@ -1487,7 +1513,7 @@ Generated by [AVA](https://avajs.dev). 3 | })␊ ` -## Invalid #83 +## Invalid #85 1 | foo.forEach(element => { 2 | const a = -- element; 3 | }) @@ -1509,7 +1535,7 @@ Generated by [AVA](https://avajs.dev). 3 | })␊ ` -## Invalid #84 +## Invalid #86 1 | foo.forEach((element, index) => { 2 | index ++; 3 | element = 2 @@ -1534,7 +1560,7 @@ Generated by [AVA](https://avajs.dev). 4 | });␊ ` -## Invalid #85 +## Invalid #87 1 | foo.forEach((element, index) => { 2 | element >>>= 2; 3 | }); @@ -1556,7 +1582,7 @@ Generated by [AVA](https://avajs.dev). 3 | });␊ ` -## Invalid #86 +## Invalid #88 1 | foo.forEach((element, index) => { 2 | const a = element = 1; 3 | }); @@ -1578,7 +1604,7 @@ Generated by [AVA](https://avajs.dev). 3 | });␊ ` -## Invalid #87 +## Invalid #89 1 | foo.forEach((element, index) => { 2 | let a; 3 | a >>>= element; @@ -1603,7 +1629,7 @@ Generated by [AVA](https://avajs.dev). 4 | });␊ ` -## Invalid #88 +## Invalid #90 1 | foo.forEach(({property}) => {bar(property)}) > Output @@ -1619,7 +1645,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #89 +## Invalid #91 1 | foo.forEach(({foo: {foo: [property]}}) => {bar(property, index)}) > Output @@ -1635,7 +1661,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #90 +## Invalid #92 1 | foo.forEach((element, {bar: {bar: [index]}}) => {bar(element, index)}) > Output @@ -1651,7 +1677,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #91 +## Invalid #93 1 | foo.forEach((element = elementDefaultValue, index = indexDefaultValue) => {}) > Output @@ -1667,7 +1693,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #92 +## Invalid #94 1 | foo.forEach(({}) => {}) > Output @@ -1683,7 +1709,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #93 +## Invalid #95 1 | foo.forEach(function foo({a, b, c, d}) {}) > Output @@ -1699,7 +1725,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #94 +## Invalid #96 1 | foo.forEach(function foo({a, b, c, d, foo}) {}) > Error 1/1 @@ -1709,7 +1735,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #95 +## Invalid #97 1 | foo.forEach(({foo: property}) => {bar(property)}) > Output @@ -1725,7 +1751,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #96 +## Invalid #98 1 | foo.forEach(({[foo]: property}) => {bar(property)}) > Output @@ -1741,7 +1767,7 @@ Generated by [AVA](https://avajs.dev). | ^^^^^^^ Use \`for…of\` instead of \`Array#forEach(…)\`.␊ ` -## Invalid #97 +## Invalid #99 1 | foo.forEach(({element}, index) => { 2 | element &&= 2; 3 | }); @@ -1763,7 +1789,7 @@ Generated by [AVA](https://avajs.dev). 3 | });␊ ` -## Invalid #98 +## Invalid #100 1 | foo.forEach(_ => { 2 | if (true) return {}; 3 | }) @@ -1785,7 +1811,7 @@ Generated by [AVA](https://avajs.dev). 3 | })␊ ` -## Invalid #99 +## Invalid #101 1 | foo.forEach(_ => { 2 | if (true); 3 | else return {}; @@ -1810,7 +1836,7 @@ Generated by [AVA](https://avajs.dev). 4 | })␊ ` -## Invalid #100 +## Invalid #102 1 | if (true) {} else[foo].forEach((element) => {}) > Output diff --git a/test/snapshots/no-array-for-each.mjs.snap b/test/snapshots/no-array-for-each.mjs.snap index 284f78411adc830ed224fb75958587a74be0f916..c83076f71b5013bce0160ddd02db637e20dfb1fa 100644 GIT binary patch literal 5271 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 literal 5185 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