Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 17 additions & 12 deletions rules/fix/remove-argument.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,35 @@
import {isCommaToken} from '@eslint-community/eslint-utils';
import {getParentheses} from '../utils/parentheses.js';

export default function removeArgument(fixer, node, sourceCode) {
const callExpression = node.parent;
const index = callExpression.arguments.indexOf(node);
export default function * removeArgument(fixer, node, context) {
const {sourceCode} = context;
for (const token of sourceCode.getTokens(node)) {
yield fixer.remove(token);
}

const parentheses = getParentheses(node, sourceCode);
const firstToken = parentheses[0] || node;
const lastToken = parentheses.at(-1) || node;
for (const token of parentheses) {
yield fixer.remove(token);
}

let [start] = sourceCode.getRange(firstToken);
let [, end] = sourceCode.getRange(lastToken);
const firstToken = parentheses[0] ?? node;
const lastToken = parentheses.at(-1) ?? node;

const callExpression = node.parent;
const index = callExpression.arguments.indexOf(node);

if (index !== 0) {
const commaToken = sourceCode.getTokenBefore(firstToken);
[start] = sourceCode.getRange(commaToken);
yield fixer.remove(commaToken);
}

// If the removed argument is the only argument, the trailing comma must be removed too
/* c8 ignore start */
if (callExpression.arguments.length === 1) {
const tokenAfter = sourceCode.getTokenBefore(lastToken);
const tokenAfter = sourceCode.getTokenAfter(lastToken);
if (isCommaToken(tokenAfter)) {
[, end] = sourceCode.getRange(tokenAfter);
yield fixer.remove(tokenAfter);
}
}
/* c8 ignore end */

return fixer.removeRange([start, end]);
}
27 changes: 13 additions & 14 deletions rules/no-array-method-this-argument.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,14 +71,15 @@ const ignored = [
'underscore.some',
];

function removeThisArgument(thisArgumentNode, sourceCode) {
return fixer => removeArgument(fixer, thisArgumentNode, sourceCode);
function removeThisArgument(thisArgumentNode, context) {
return fixer => removeArgument(fixer, thisArgumentNode, context);
}

function useBoundFunction(callbackNode, thisArgumentNode, sourceCode) {
function useBoundFunction(callbackNode, thisArgumentNode, context) {
return function * (fixer) {
yield removeThisArgument(thisArgumentNode, sourceCode)(fixer);
yield * removeThisArgument(thisArgumentNode, context)(fixer);

const {sourceCode} = context;
const callbackParentheses = getParentheses(callbackNode, sourceCode);
const isParenthesized = callbackParentheses.length > 0;
const callbackLastToken = isParenthesized
Expand All @@ -99,7 +100,7 @@ function useBoundFunction(callbackNode, thisArgumentNode, sourceCode) {
}

function getProblem({
sourceCode,
context,
callExpression,
callbackNode,
thisArgumentNode,
Expand All @@ -115,16 +116,16 @@ function getProblem({

const isArrowCallback = callbackNode.type === 'ArrowFunctionExpression';
if (isArrowCallback) {
const thisArgumentHasSideEffect = hasSideEffect(thisArgumentNode, sourceCode);
const thisArgumentHasSideEffect = hasSideEffect(thisArgumentNode, context.sourceCode);
if (thisArgumentHasSideEffect) {
problem.suggest = [
{
messageId: SUGGESTION_REMOVE,
fix: removeThisArgument(thisArgumentNode, sourceCode),
fix: removeThisArgument(thisArgumentNode, context),
},
];
} else {
problem.fix = removeThisArgument(thisArgumentNode, sourceCode);
problem.fix = removeThisArgument(thisArgumentNode, context);
}

return problem;
Expand All @@ -133,11 +134,11 @@ function getProblem({
problem.suggest = [
{
messageId: SUGGESTION_REMOVE,
fix: removeThisArgument(thisArgumentNode, sourceCode),
fix: removeThisArgument(thisArgumentNode, context),
},
{
messageId: SUGGESTION_BIND,
fix: useBoundFunction(callbackNode, thisArgumentNode, sourceCode),
fix: useBoundFunction(callbackNode, thisArgumentNode, context),
},
];

Expand All @@ -146,8 +147,6 @@ function getProblem({

/** @param {import('eslint').Rule.RuleContext} context */
const create = context => {
const {sourceCode} = context;

// Prototype methods
context.on('CallExpression', callExpression => {
if (
Expand Down Expand Up @@ -175,7 +174,7 @@ const create = context => {
}

return getProblem({
sourceCode,
context,
callExpression,
callbackNode: callExpression.arguments[0],
thisArgumentNode: callExpression.arguments[1],
Expand All @@ -199,7 +198,7 @@ const create = context => {
}

return getProblem({
sourceCode,
context,
callExpression,
callbackNode: callExpression.arguments[1],
thisArgumentNode: callExpression.arguments[2],
Expand Down
2 changes: 1 addition & 1 deletion rules/no-unnecessary-array-flat-depth.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ const create = context => {
node: numberOne,
messageId: MESSAGE_ID,
/** @param {import('eslint').Rule.RuleFixer} fixer */
fix: fixer => removeArgument(fixer, numberOne, context.sourceCode),
fix: fixer => removeArgument(fixer, numberOne, context),
};
});
};
Expand Down
2 changes: 1 addition & 1 deletion rules/prefer-json-parse-buffer.js
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ const create = context => ({
return {
node: charsetNode,
messageId: MESSAGE_ID,
fix: fixer => removeArgument(fixer, charsetNode, sourceCode),
fix: fixer => removeArgument(fixer, charsetNode, context),
};
},
});
Expand Down
2 changes: 1 addition & 1 deletion rules/shared/no-unnecessary-length-or-infinity-rule.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ function listen(context, {methods, messageId}) {
messageId,
data: messageData,
/** @param {import('eslint').Rule.RuleFixer} fixer */
fix: fixer => removeArgument(fixer, secondArgument, context.sourceCode),
fix: fixer => removeArgument(fixer, secondArgument, context),
};
});
}
Expand Down
19 changes: 19 additions & 0 deletions test/no-array-method-this-argument.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import {outdent} from 'outdent';
import {getTester, parsers} from './utils/test.js';

const {test} = getTester(import.meta);
Expand Down Expand Up @@ -90,6 +91,24 @@ test.snapshot({
'array.map(() => {}, thisArgumentHasSideEffect())',
'Array.from(iterableOrArrayLike, () => {}, thisArgumentHasSideEffect())',
'Array.fromAsync(iterableOrArrayLike, () => {}, thisArgumentHasSideEffect())',
outdent`
array.map(
() => {} /* comment 1 */ ,
/* comment 2 */
(
/* comment 3 */
(
/* comment 4 */
there.are/* comment 5 */.many.comments
/* comment 6 */
)
/* comment 7 */
)
/* comment 8 */
,
/* comment 9 */
)
`,
],
});

Expand Down
Loading
Loading