Skip to content

Commit 77bcdc6

Browse files
authored
no-array-callback-reference: Improve suggestions for Array#forEach() (#1049)
1 parent 4271e95 commit 77bcdc6

File tree

2 files changed

+35
-6
lines changed

2 files changed

+35
-6
lines changed

rules/no-array-callback-reference.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@ const iteratorMethods = [
2525
['find'],
2626
['findIndex'],
2727
['flatMap'],
28-
['forEach'],
28+
[
29+
'forEach', {
30+
returnsUndefined: true
31+
}
32+
],
2933
['map'],
3034
[
3135
'reduce', {
@@ -58,6 +62,7 @@ const iteratorMethods = [
5862
ignore: ['Boolean'],
5963
minParameters: 1,
6064
extraSelector: '',
65+
returnsUndefined: false,
6166
...options
6267
};
6368
return [method, options];
@@ -105,7 +110,7 @@ function check(context, node, method, options) {
105110
suggest: []
106111
};
107112

108-
const {parameters, minParameters} = options;
113+
const {parameters, minParameters, returnsUndefined} = options;
109114
for (let parameterLength = minParameters; parameterLength <= parameters.length; parameterLength++) {
110115
const suggestionParameters = parameters.slice(0, parameterLength).join(', ');
111116

@@ -124,7 +129,9 @@ function check(context, node, method, options) {
124129

125130
return fixer.replaceText(
126131
node,
127-
`(${suggestionParameters}) => ${nodeText}(${suggestionParameters})`
132+
returnsUndefined ?
133+
`(${suggestionParameters}) => { ${nodeText}(${suggestionParameters}); }` :
134+
`(${suggestionParameters}) => ${nodeText}(${suggestionParameters})`
128135
);
129136
}
130137
};

test/no-array-callback-reference.js

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ const simpleMethods = [
1717
'map'
1818
];
1919

20+
const simpleMethodsExceptForEach = simpleMethods.filter(name => name !== 'forEach');
21+
2022
const reduceLikeMethods = [
2123
'reduce',
2224
'reduceRight'
@@ -125,7 +127,7 @@ ruleTester.run('no-array-callback-reference', rule, {
125127
],
126128
invalid: [
127129
// Suggestions
128-
...simpleMethods.map(
130+
...simpleMethodsExceptForEach.map(
129131
method => invalidTestCase({
130132
code: `foo.${method}(fn)`,
131133
method,
@@ -137,6 +139,16 @@ ruleTester.run('no-array-callback-reference', rule, {
137139
]
138140
})
139141
),
142+
invalidTestCase({
143+
code: 'foo.forEach(fn)',
144+
method: 'forEach',
145+
name: 'fn',
146+
suggestions: [
147+
'foo.forEach((element) => { fn(element); })',
148+
'foo.forEach((element, index) => { fn(element, index); })',
149+
'foo.forEach((element, index, array) => { fn(element, index, array); })'
150+
]
151+
}),
140152
...reduceLikeMethods.map(
141153
method => invalidTestCase({
142154
code: `foo.${method}(fn)`,
@@ -151,7 +163,7 @@ ruleTester.run('no-array-callback-reference', rule, {
151163
),
152164

153165
// 2 arguments
154-
...simpleMethods.map(
166+
...simpleMethodsExceptForEach.map(
155167
method => invalidTestCase({
156168
code: `foo.${method}(fn, thisArgument)`,
157169
method,
@@ -163,6 +175,16 @@ ruleTester.run('no-array-callback-reference', rule, {
163175
]
164176
})
165177
),
178+
invalidTestCase({
179+
code: 'foo.forEach(fn, thisArgument)',
180+
method: 'forEach',
181+
name: 'fn',
182+
suggestions: [
183+
'foo.forEach((element) => { fn(element); }, thisArgument)',
184+
'foo.forEach((element, index) => { fn(element, index); }, thisArgument)',
185+
'foo.forEach((element, index, array) => { fn(element, index, array); }, thisArgument)'
186+
]
187+
}),
166188
...reduceLikeMethods.map(
167189
method => invalidTestCase({
168190
code: `foo.${method}(fn, initialValue)`,
@@ -191,7 +213,7 @@ ruleTester.run('no-array-callback-reference', rule, {
191213
),
192214

193215
// Not `Identifier`
194-
...simpleMethods.map(
216+
...simpleMethodsExceptForEach.map(
195217
method => invalidTestCase({
196218
code: `foo.${method}(lib.fn)`,
197219
method,

0 commit comments

Comments
 (0)