Skip to content

Commit ea89962

Browse files
authored
Replace .range with sourceCode.getRange() (#2553)
1 parent d963ccd commit ea89962

37 files changed

+127
-102
lines changed

rules/consistent-existence-index-check.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,12 @@ const create = context => ({
9696
token => token.type === 'Punctuator' && token.value === operator,
9797
);
9898

99+
const [start] = sourceCode.getRange(operatorToken);
100+
const [, end] = sourceCode.getRange(right);
101+
99102
yield {
100103
node: binaryExpression,
101-
loc: toLocation([operatorToken.range[0], right.range[1]], sourceCode),
104+
loc: toLocation([start, end], sourceCode),
102105
messageId: MESSAGE_ID,
103106
data: {
104107
...replacement,

rules/custom-error-definition.js

+10-9
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@ function * customErrorDefinition(context, node) {
7777
};
7878
}
7979

80-
const {body, range} = node.body;
80+
const {sourceCode} = context;
81+
const {body} = node.body;
82+
const range = sourceCode.getRange(node.body);
8183
const constructor = body.find(x => x.kind === 'constructor');
8284

8385
if (!constructor) {
@@ -118,16 +120,15 @@ function * customErrorDefinition(context, node) {
118120
* fix(fixer) {
119121
if (superExpression.expression.arguments.length === 0) {
120122
const rhs = expression.expression.right;
121-
yield fixer.insertTextAfterRange([
122-
superExpression.range[0],
123-
superExpression.range[0] + 6,
124-
], rhs.raw || rhs.name);
123+
const [start] = sourceCode.getRange(superExpression);
124+
yield fixer.insertTextAfterRange([start, start + 6], rhs.raw || rhs.name);
125125
}
126126

127-
yield fixer.removeRange([
128-
messageExpressionIndex === 0 ? constructorBodyNode.range[0] : constructorBody[messageExpressionIndex - 1].range[1],
129-
expression.range[1],
130-
]);
127+
const start = messageExpressionIndex === 0
128+
? sourceCode.getRange(constructorBodyNode)[0]
129+
: sourceCode.getRange(constructorBody[messageExpressionIndex - 1])[1];
130+
const [, end] = sourceCode.getRange(expression);
131+
yield fixer.removeRange([start, end]);
131132
},
132133
};
133134
}

rules/empty-brace-spaces.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ const getProblem = (node, context) => {
1212
: isOpeningBraceToken;
1313
const openingBrace = sourceCode.getFirstToken(node, {filter});
1414
const closingBrace = sourceCode.getLastToken(node);
15-
const [, start] = openingBrace.range;
16-
const [end] = closingBrace.range;
15+
const [, start] = sourceCode.getRange(openingBrace);
16+
const [end] = sourceCode.getRange(closingBrace);
1717
const textBetween = sourceCode.text.slice(start, end);
1818

1919
if (!/^\s+$/.test(textBetween)) {

rules/fix/remove-argument.js

+5-4
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,20 @@ export default function removeArgument(fixer, node, sourceCode) {
88
const firstToken = parentheses[0] || node;
99
const lastToken = parentheses.at(-1) || node;
1010

11-
let [start] = firstToken.range;
12-
let [, end] = lastToken.range;
11+
let [start] = sourceCode.getRange(firstToken);
12+
let [, end] = sourceCode.getRange(lastToken);
1313

1414
if (index !== 0) {
15-
start = sourceCode.getTokenBefore(firstToken).range[0];
15+
const commaToken = sourceCode.getTokenBefore(firstToken);
16+
[start] = sourceCode.getRange(commaToken);
1617
}
1718

1819
// If the removed argument is the only argument, the trailing comma must be removed too
1920
/* c8 ignore start */
2021
if (callExpression.arguments.length === 1) {
2122
const tokenAfter = sourceCode.getTokenBefore(lastToken);
2223
if (isCommaToken(tokenAfter)) {
23-
end = tokenAfter[1];
24+
[, end] = sourceCode.getRange(tokenAfter);
2425
}
2526
}
2627
/* c8 ignore end */

rules/fix/remove-member-expression-property.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ import {getParenthesizedRange} from '../utils/parentheses.js';
22

33
export default function removeMemberExpressionProperty(fixer, memberExpression, sourceCode) {
44
const [, start] = getParenthesizedRange(memberExpression.object, sourceCode);
5-
const [, end] = memberExpression.range;
5+
const [, end] = sourceCode.getRange(memberExpression);
66
return fixer.removeRange([start, end]);
77
}

rules/fix/remove-method-call.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export default function * removeMethodCall(fixer, callExpression, sourceCode) {
1111
// `(( (( foo )).bar ))()`
1212
// ^^
1313
const [, start] = getParenthesizedRange(memberExpression, sourceCode);
14-
const [, end] = callExpression.range;
14+
const [, end] = sourceCode.getRange(callExpression);
1515

1616
yield fixer.removeRange([start, end]);
1717
}

rules/fix/remove-specifier.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ export default function * removeSpecifier(specifier, fixer, sourceCode, keepDecl
1717

1818
const hasDefaultImport = specifiers.some(node => node.type === 'ImportDefaultSpecifier');
1919
const startToken = sourceCode.getTokenBefore(specifier, hasDefaultImport ? isCommaToken : isOpeningBraceToken);
20+
const [start] = sourceCode.getRange(startToken);
21+
const [end] = sourceCode.getRange(fromToken);
2022
const tokenBefore = sourceCode.getTokenBefore(startToken);
23+
const shouldInsertSpace = sourceCode.getRange(tokenBefore)[1] === start;
2124

22-
yield fixer.replaceTextRange(
23-
[startToken.range[0], fromToken.range[0]],
24-
tokenBefore.range[1] === startToken.range[0] ? ' ' : '',
25-
);
25+
yield fixer.replaceTextRange([start, end], shouldInsertSpace ? ' ' : '');
2626
return;
2727
}
2828
// Fallthrough

rules/fix/replace-node-or-token-and-spaces-before.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export default function * replaceNodeOrTokenAndSpacesBefore(nodeOrToken, replace
77
yield * replaceNodeOrTokenAndSpacesBefore(token, '', fixer, sourceCode, tokenStore);
88
}
99

10-
let [start, end] = nodeOrToken.range;
10+
let [start, end] = sourceCode.getRange(nodeOrToken);
1111

1212
const textBefore = sourceCode.text.slice(0, start);
1313
const [trailingSpaces] = textBefore.match(/\s*$/);

rules/no-anonymous-default-export.js

+7-4
Original file line numberDiff line numberDiff line change
@@ -64,17 +64,20 @@ function addName(fixer, node, name, sourceCode) {
6464
node,
6565
isOpeningParenToken,
6666
);
67+
const characterBefore = sourceCode.text.charAt(sourceCode.getRange(openingParenthesisToken)[0] - 1);
6768
return fixer.insertTextBefore(
6869
openingParenthesisToken,
69-
`${sourceCode.text.charAt(openingParenthesisToken.range[0] - 1) === ' ' ? '' : ' '}${name} `,
70+
`${characterBefore === ' ' ? '' : ' '}${name} `,
7071
);
7172
}
7273

7374
case 'ArrowFunctionExpression': {
7475
const [exportDeclarationStart, exportDeclarationEnd]
75-
= node.parent.type === 'ExportDefaultDeclaration'
76-
? node.parent.range
77-
: node.parent.parent.range;
76+
= sourceCode.getRange(
77+
node.parent.type === 'ExportDefaultDeclaration'
78+
? node.parent
79+
: node.parent.parent,
80+
);
7881
const [arrowFunctionStart, arrowFunctionEnd] = getParenthesizedRange(node, sourceCode);
7982

8083
let textBefore = sourceCode.text.slice(exportDeclarationStart, arrowFunctionStart);

rules/no-array-for-each.js

+5-4
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ function getFixFunction(callExpression, functionInfo, context) {
120120
};
121121

122122
const getForOfLoopHeadRange = () => {
123-
const [start] = callExpression.range;
123+
const [start] = sourceCode.getRange(callExpression);
124124
const [end] = getParenthesizedRange(callback.body, sourceCode);
125125
return [start, end];
126126
};
@@ -262,7 +262,7 @@ function getFixFunction(callExpression, functionInfo, context) {
262262
}
263263

264264
// Prevent possible variable conflicts
265-
yield * extendFixRange(fixer, callExpression.parent.range);
265+
yield * extendFixRange(fixer, sourceCode.getRange(callExpression.parent));
266266
};
267267
}
268268

@@ -290,9 +290,10 @@ function isFunctionParametersSafeToFix(callbackFunction, {sourceCode, scope, cal
290290
}
291291

292292
const variableName = definition.name.name;
293-
const [callExpressionStart, callExpressionEnd] = callExpression.range;
293+
const [callExpressionStart, callExpressionEnd] = sourceCode.getRange(callExpression);
294294
for (const identifier of allIdentifiers) {
295-
const {name, range: [start, end]} = identifier;
295+
const {name} = identifier;
296+
const [start, end] = sourceCode.getRange(identifier);
296297
if (
297298
name !== variableName
298299
|| start < callExpressionStart

rules/no-array-push-push.js

+3-4
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,10 @@ function create(context) {
9595
const secondExpression = secondCall.parent;
9696
const shouldKeepSemicolon = !isSemicolonToken(sourceCode.getLastToken(firstExpression))
9797
&& isSemicolonToken(sourceCode.getLastToken(secondExpression));
98+
const [, start] = sourceCode.getRange(firstExpression);
99+
const [, end] = sourceCode.getRange(secondExpression);
98100

99-
yield fixer.replaceTextRange(
100-
[firstExpression.range[1], secondExpression.range[1]],
101-
shouldKeepSemicolon ? ';' : '',
102-
);
101+
yield fixer.replaceTextRange([start, end], shouldKeepSemicolon ? ';' : '');
103102
};
104103

105104
if (secondCallArguments.some(element => hasSideEffect(element, sourceCode))) {

rules/no-console-spaces.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@ const hasTrailingSpace = value => value.length > 1 && value.at(-1) === ' ' && va
1616
const create = context => {
1717
const {sourceCode} = context;
1818
const getProblem = (node, method, position) => {
19+
const [start, end] = sourceCode.getRange(node);
1920
const index = position === 'leading'
20-
? node.range[0] + 1
21-
: node.range[1] - 2;
21+
? start + 1
22+
: end - 2;
2223
const range = [index, index + 1];
2324

2425
return {

rules/no-for-loop.js

+11-11
Original file line numberDiff line numberDiff line change
@@ -174,21 +174,21 @@ const getRemovalRange = (node, sourceCode) => {
174174
sourceCode.getIndexFromLoc({line, column: 0}),
175175
sourceCode.getIndexFromLoc({line: line + 1, column: 0}),
176176
]
177-
: declarationNode.range;
177+
: sourceCode.getRange(declarationNode);
178178
}
179179

180180
const index = declarationNode.declarations.indexOf(node);
181181

182182
if (index === 0) {
183183
return [
184-
node.range[0],
185-
declarationNode.declarations[1].range[0],
184+
sourceCode.getRange(node)[0],
185+
sourceCode.getRange(declarationNode.declarations[1])[0],
186186
];
187187
}
188188

189189
return [
190-
declarationNode.declarations[index - 1].range[1],
191-
node.range[1],
190+
sourceCode.getRange(declarationNode.declarations[index - 1])[1],
191+
sourceCode.getRange(node)[1],
192192
];
193193
};
194194

@@ -321,8 +321,9 @@ const create = context => {
321321
return;
322322
}
323323

324-
const [start] = node.range;
325-
const [, end] = sourceCode.getTokenBefore(node.body, isClosingParenToken).range;
324+
const [start] = sourceCode.getRange(node);
325+
const closingParenthesisToken = sourceCode.getTokenBefore(node.body, isClosingParenToken);
326+
const [, end] = sourceCode.getRange(closingParenthesisToken);
326327

327328
const problem = {
328329
loc: toLocation([start, end], sourceCode),
@@ -376,11 +377,10 @@ const create = context => {
376377
}
377378

378379
const replacement = parts.join('');
380+
const [start] = sourceCode.getRange(node.init);
381+
const [, end] = sourceCode.getRange(node.update);
379382

380-
yield fixer.replaceTextRange([
381-
node.init.range[0],
382-
node.update.range[1],
383-
], replacement);
383+
yield fixer.replaceTextRange([start, end], replacement);
384384

385385
for (const reference of arrayReferences) {
386386
if (reference !== elementReference) {

rules/no-named-default.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ const fixImportSpecifier = (importSpecifier, {sourceCode}) => function * (fixer)
2020
// Insert a new `ImportDeclaration`
2121
if (hasDefaultImport) {
2222
const fromToken = sourceCode.getTokenBefore(declaration.source, token => token.type === 'Identifier' && token.value === 'from');
23-
const text = `import ${nameText} ${sourceCode.text.slice(fromToken.range[0], declaration.range[1])}`;
23+
const [startOfFromToken] = sourceCode.getRange(fromToken);
24+
const [, endOfDeclaration] = sourceCode.getRange(declaration);
25+
const text = `import ${nameText} ${sourceCode.text.slice(startOfFromToken, endOfDeclaration)}`;
2426
yield fixer.insertTextBefore(declaration, `${text}\n`);
2527

2628
return;

rules/no-negated-condition.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ function * swapConsequentAndAlternate(fixer, node, sourceCode) {
6060
return;
6161
}
6262

63-
yield fixer.replaceTextRange(consequent.range, alternate.text);
64-
yield fixer.replaceTextRange(alternate.range, consequent.text);
63+
yield fixer.replaceTextRange(sourceCode.getRange(consequent), alternate.text);
64+
yield fixer.replaceTextRange(sourceCode.getRange(alternate), consequent.text);
6565
}
6666

6767
/** @param {import('eslint').Rule.RuleContext} context */

rules/no-null.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,13 @@ const create = context => {
103103
}
104104

105105
if (parent.type === 'VariableDeclarator' && parent.init === node && parent.parent.kind !== 'const') {
106+
const {sourceCode} = context;
107+
const [, start] = sourceCode.getRange(parent.id);
108+
const [, end] = sourceCode.getRange(node);
106109
problem.suggest = [
107110
{
108111
messageId: SUGGESTION_REMOVE_MESSAGE_ID,
109-
fix: fixer => fixer.removeRange([parent.id.range[1], node.range[1]]),
112+
fix: fixer => fixer.removeRange([start, end]),
110113
},
111114
useUndefinedSuggestion,
112115
];

rules/no-useless-fallback-in-spread.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ const create = context => ({
3333
const isLeftObjectParenthesized = isParenthesized(left, sourceCode);
3434
const [, start] = isLeftObjectParenthesized
3535
? getParenthesizedRange(left, sourceCode)
36-
: left.range;
37-
const [, end] = logicalExpression.range;
36+
: sourceCode.getRange(left);
37+
const [, end] = sourceCode.getRange(logicalExpression);
3838

3939
yield fixer.removeRange([start, end]);
4040

rules/no-useless-undefined.js

+10-6
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,11 @@ const create = context => {
171171
&& node.parent.parent.kind !== 'const'
172172
&& node.parent.parent.declarations.includes(node.parent)
173173
) {
174+
const [, start] = sourceCode.getRange(node.parent.id);
175+
const [, end] = sourceCode.getRange(node);
174176
return getProblem(
175177
node,
176-
fixer => fixer.removeRange([node.parent.id.range[1], node.range[1]]),
178+
fixer => fixer.removeRange([start, end]),
177179
/* CheckFunctionReturnType */ true,
178180
);
179181
}
@@ -191,8 +193,10 @@ const create = context => {
191193
function * (fixer) {
192194
const assignmentPattern = node.parent;
193195
const {left} = assignmentPattern;
196+
const [, start] = sourceCode.getRange(left);
197+
const [, end] = sourceCode.getRange(node);
194198

195-
yield fixer.removeRange([left.range[1], node.range[1]]);
199+
yield fixer.removeRange([start, end]);
196200
if (
197201
(left.typeAnnotation || isTypeScriptFile(context))
198202
&& !left.optional
@@ -251,18 +255,18 @@ const create = context => {
251255
end: lastUndefined.loc.end,
252256
},
253257
fix(fixer) {
254-
let start = firstUndefined.range[0];
255-
let end = lastUndefined.range[1];
258+
let [start] = sourceCode.getRange(firstUndefined);
259+
let [, end] = sourceCode.getRange(lastUndefined);
256260

257261
const previousArgument = argumentNodes[argumentNodes.length - undefinedArguments.length - 1];
258262

259263
if (previousArgument) {
260-
start = previousArgument.range[1];
264+
[, start] = sourceCode.getRange(previousArgument);
261265
} else {
262266
// If all arguments removed, and there is trailing comma, we need remove it.
263267
const tokenAfter = sourceCode.getTokenAfter(lastUndefined);
264268
if (isCommaToken(tokenAfter)) {
265-
end = tokenAfter.range[1];
269+
[, end] = sourceCode.getRange(tokenAfter);
266270
}
267271
}
268272

rules/no-zero-fractions.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ const create = context => ({
3535
}
3636

3737
const isDanglingDot = dotAndFractions === '.';
38+
const {sourceCode} = context;
3839
// End of fractions
39-
const end = node.range[0] + before.length + dotAndFractions.length;
40+
const end = sourceCode.getRange(node)[0] + before.length + dotAndFractions.length;
4041
const start = end - (raw.length - formatted.length);
41-
const {sourceCode} = context;
4242
return {
4343
loc: toLocation([start, end], sourceCode),
4444
messageId: isDanglingDot ? MESSAGE_DANGLING_DOT : MESSAGE_ZERO_FRACTION,

rules/prefer-array-find.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ const create = context => {
320320
yield * renameVariable(variable, singularizedName, fixer);
321321

322322
// Prevent possible variable conflicts
323-
yield * extendFixRange(fixer, sourceCode.ast.range);
323+
yield * extendFixRange(fixer, sourceCode.getRange(sourceCode.ast));
324324
}
325325

326326
for (const node of zeroIndexNodes) {

0 commit comments

Comments
 (0)