Skip to content

Commit 35fdb1c

Browse files
authored
Add internal rule prefer-fixer-remove-range (#2545)
1 parent 41548c4 commit 35fdb1c

7 files changed

+55
-6
lines changed

rules/fix/remove-argument.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,5 @@ export default function removeArgument(fixer, node, sourceCode) {
2525
}
2626
/* c8 ignore end */
2727

28-
return fixer.replaceTextRange([start, end], '');
28+
return fixer.removeRange([start, end]);
2929
}

rules/prefer-array-some.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ const create = context => {
7979
}
8080

8181
const parenthesizedRange = getParenthesizedRange(callExpression, context.sourceCode);
82-
yield fixer.replaceTextRange([parenthesizedRange[1], callExpression.parent.range[1]], '');
82+
yield fixer.removeRange([parenthesizedRange[1], callExpression.parent.range[1]]);
8383

8484
if (callExpression.parent.operator === '!=' || callExpression.parent.operator === '!==') {
8585
return;

rules/prefer-object-from-entries.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ function fixReduceAssignOrSpread({sourceCode, callExpression, property}) {
102102
const startToken = sourceCode.getTokenBefore(firstToken);
103103
const [start] = startToken.range;
104104
const [, end] = lastToken.range;
105-
return fixer.replaceTextRange([start, end], '');
105+
return fixer.removeRange([start, end]);
106106
};
107107

108108
function * removeFirstParameter(fixer) {

rules/prefer-spread.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ function fixConcat(node, sourceCode, fixableArguments) {
132132
const [leadingSpaces] = textAfter.match(/^\s*/);
133133
end += leadingSpaces.length;
134134

135-
return fixer.replaceTextRange([start, end], '');
135+
return fixer.removeRange([start, end]);
136136
}
137137

138138
return function * (fixer) {

rules/prefer-switch.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -229,10 +229,10 @@ function fix({discriminant, ifStatements}, sourceCode, options) {
229229
if (alternate) {
230230
const [, start] = consequent.range;
231231
const [end] = alternate.range;
232-
yield fixer.replaceTextRange([start, end], '');
232+
yield fixer.removeRange([start, end]);
233233
}
234234

235-
yield fixer.replaceTextRange(headRange, '');
235+
yield fixer.removeRange(headRange);
236236
for (const {left, right} of compareExpressions) {
237237
const node = isSame(left, discriminant) ? right : left;
238238
const text = sourceCode.getText(node);

scripts/internal-rules/index.js

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import packageJson from './package.json' with {type: 'json'};
33
import fixSnapshotTest from './fix-snapshot-test.js';
44
import noTestOnly from './no-test-only.js';
55
import preferNegativeBooleanAttribute from './prefer-negative-boolean-attribute.js';
6+
import preferFixerRemoveRange from './prefer-fixer-remove-range.js';
67

78
const pluginName = 'internal';
89

@@ -18,6 +19,7 @@ const rules = [
1819
{id: 'fix-snapshot-test', directories: TEST_DIRECTORIES, rule: fixSnapshotTest},
1920
{id: 'prefer-negative-boolean-attribute', directories: RULES_DIRECTORIES, rule: preferNegativeBooleanAttribute},
2021
{id: 'no-test-only', directories: TEST_DIRECTORIES, rule: noTestOnly},
22+
{id: 'prefer-fixer-remove-range', directories: RULES_DIRECTORIES, rule: preferFixerRemoveRange},
2123
];
2224

2325
const isFileInsideDirectory = (filename, directory) => filename.startsWith(directory);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import path from 'node:path';
2+
import {fileURLToPath} from 'node:url';
3+
import {isMethodCall, isLiteral} from '../../rules/ast/index.js';
4+
import {removeArgument} from '../../rules/fix/index.js';
5+
6+
const messageId = path.basename(fileURLToPath(import.meta.url), '.js');
7+
8+
const config = {
9+
create(context) {
10+
return {
11+
CallExpression(callExpression) {
12+
const [, emptyString] = callExpression.arguments;
13+
14+
if (!(
15+
isMethodCall(callExpression, {
16+
object: 'fixer',
17+
method: 'replaceTextRange',
18+
argumentsLength: 2,
19+
optionalCall: false,
20+
optionalMember: false,
21+
})
22+
&& isLiteral(emptyString, '')
23+
)) {
24+
return;
25+
}
26+
27+
const {property} = callExpression.callee;
28+
context.report({
29+
node: property,
30+
messageId,
31+
* fix(fixer) {
32+
yield removeArgument(fixer, emptyString, context.sourceCode);
33+
yield fixer.replaceText(property, 'removeRange');
34+
},
35+
});
36+
},
37+
};
38+
},
39+
meta: {
40+
fixable: 'code',
41+
messages: {
42+
[messageId]: 'Prefer `fixer.removeRange(…)` over `fixer.replaceTextRange(…, \'\')`.',
43+
},
44+
},
45+
};
46+
47+
export default config;

0 commit comments

Comments
 (0)