Skip to content

Commit fde97ab

Browse files
authored
prefer-number-properties: Simplify with GlobalReferenceTracker (#1908)
1 parent 412fc6f commit fde97ab

File tree

1 file changed

+49
-57
lines changed

1 file changed

+49
-57
lines changed

rules/prefer-number-properties.js

+49-57
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
'use strict';
2-
const {ReferenceTracker} = require('eslint-utils');
2+
const {GlobalReferenceTracker} = require('./utils/global-reference-tracker.js');
33
const {replaceReferenceIdentifier} = require('./fix/index.js');
44
const {fixSpaceAroundKeyword} = require('./fix/index.js');
55

@@ -27,62 +27,50 @@ const isNegative = node => {
2727
return parent && parent.type === 'UnaryExpression' && parent.operator === '-' && parent.argument === node;
2828
};
2929

30-
function * checkProperties({sourceCode, tracker, checkInfinity}) {
31-
let names = Object.keys(globalObjects);
32-
if (!checkInfinity) {
33-
names = names.filter(name => name !== 'Infinity');
30+
function checkProperty({node, path: [name]}, sourceCode) {
31+
const {parent} = node;
32+
33+
let property = name;
34+
if (name === 'Infinity') {
35+
property = isNegative(node) ? 'NEGATIVE_INFINITY' : 'POSITIVE_INFINITY';
3436
}
3537

36-
const traceMap = Object.fromEntries(
37-
names.map(name => [name, {[ReferenceTracker.READ]: true}]),
38-
);
38+
const problem = {
39+
node,
40+
messageId: MESSAGE_ID_ERROR,
41+
data: {
42+
description: name,
43+
property,
44+
},
45+
};
3946

40-
for (const {node, path: [name]} of tracker.iterateGlobalReferences(traceMap)) {
41-
const {parent} = node;
47+
if (property === 'NEGATIVE_INFINITY') {
48+
problem.node = parent;
49+
problem.data.description = '-Infinity';
50+
problem.fix = function * (fixer) {
51+
yield fixer.replaceText(parent, 'Number.NEGATIVE_INFINITY');
52+
yield * fixSpaceAroundKeyword(fixer, parent, sourceCode);
53+
};
4254

43-
let property = name;
44-
if (name === 'Infinity') {
45-
property = isNegative(node) ? 'NEGATIVE_INFINITY' : 'POSITIVE_INFINITY';
46-
}
55+
return problem;
56+
}
4757

48-
const problem = {
49-
node,
50-
messageId: MESSAGE_ID_ERROR,
51-
data: {
52-
description: name,
53-
property,
58+
const fix = fixer => replaceReferenceIdentifier(node, `Number.${property}`, fixer, sourceCode);
59+
const isSafeToFix = globalObjects[name];
60+
61+
if (isSafeToFix) {
62+
problem.fix = fix;
63+
} else {
64+
problem.suggest = [
65+
{
66+
messageId: MESSAGE_ID_SUGGESTION,
67+
data: problem.data,
68+
fix,
5469
},
55-
};
56-
57-
if (property === 'NEGATIVE_INFINITY') {
58-
problem.node = parent;
59-
problem.data.description = '-Infinity';
60-
problem.fix = function * (fixer) {
61-
yield fixer.replaceText(parent, 'Number.NEGATIVE_INFINITY');
62-
yield * fixSpaceAroundKeyword(fixer, parent, sourceCode);
63-
};
64-
65-
yield problem;
66-
continue;
67-
}
68-
69-
const fix = fixer => replaceReferenceIdentifier(node, `Number.${property}`, fixer, sourceCode);
70-
const isSafeToFix = globalObjects[name];
71-
72-
if (isSafeToFix) {
73-
problem.fix = fix;
74-
} else {
75-
problem.suggest = [
76-
{
77-
messageId: MESSAGE_ID_SUGGESTION,
78-
data: problem.data,
79-
fix,
80-
},
81-
];
82-
}
83-
84-
yield problem;
70+
];
8571
}
72+
73+
return problem;
8674
}
8775

8876
/** @param {import('eslint').Rule.RuleContext} context */
@@ -93,15 +81,19 @@ const create = context => {
9381
checkInfinity: true,
9482
...context.options[0],
9583
};
84+
const sourceCode = context.getSourceCode();
9685

97-
return {
98-
* 'Program:exit'() {
99-
const sourceCode = context.getSourceCode();
100-
const tracker = new ReferenceTracker(context.getScope());
86+
let objects = Object.keys(globalObjects);
87+
if (!checkInfinity) {
88+
objects = objects.filter(name => name !== 'Infinity');
89+
}
10190

102-
yield * checkProperties({sourceCode, tracker, checkInfinity});
103-
},
104-
};
91+
const tracker = new GlobalReferenceTracker({
92+
objects,
93+
handle: reference => checkProperty(reference, sourceCode),
94+
});
95+
96+
return tracker.createListeners(context);
10597
};
10698

10799
const schema = [

0 commit comments

Comments
 (0)