1
1
'use strict' ;
2
- const { ReferenceTracker } = require ( 'eslint- utils' ) ;
2
+ const { GlobalReferenceTracker } = require ( './ utils/global-reference-tracker.js ' ) ;
3
3
const { replaceReferenceIdentifier} = require ( './fix/index.js' ) ;
4
4
const { fixSpaceAroundKeyword} = require ( './fix/index.js' ) ;
5
5
@@ -27,62 +27,50 @@ const isNegative = node => {
27
27
return parent && parent . type === 'UnaryExpression' && parent . operator === '-' && parent . argument === node ;
28
28
} ;
29
29
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' ;
34
36
}
35
37
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
+ } ;
39
46
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
+ } ;
42
54
43
- let property = name ;
44
- if ( name === 'Infinity' ) {
45
- property = isNegative ( node ) ? 'NEGATIVE_INFINITY' : 'POSITIVE_INFINITY' ;
46
- }
55
+ return problem ;
56
+ }
47
57
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,
54
69
} ,
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
+ ] ;
85
71
}
72
+
73
+ return problem ;
86
74
}
87
75
88
76
/** @param {import('eslint').Rule.RuleContext } context */
@@ -93,15 +81,19 @@ const create = context => {
93
81
checkInfinity : true ,
94
82
...context . options [ 0 ] ,
95
83
} ;
84
+ const sourceCode = context . getSourceCode ( ) ;
96
85
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
+ }
101
90
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 ) ;
105
97
} ;
106
98
107
99
const schema = [
0 commit comments