1
1
'use strict' ;
2
- const { ReferenceTracker } = require ( 'eslint- utils' ) ;
2
+ const { GlobalReferenceTracker } = require ( './ utils/global-reference-tracker.js ' ) ;
3
3
const builtins = require ( './utils/builtins.js' ) ;
4
4
const {
5
5
switchCallExpressionToNewExpression,
@@ -11,64 +11,65 @@ const messages = {
11
11
disallow : 'Use `{{name}}()` instead of `new {{name}}()`.' ,
12
12
} ;
13
13
14
- function * enforceNewExpression ( { sourceCode, tracker} ) {
15
- const traceMap = Object . fromEntries (
16
- builtins . enforceNew . map ( name => [ name , { [ ReferenceTracker . CALL ] : true } ] ) ,
17
- ) ;
18
-
19
- for ( const { node, path : [ name ] } of tracker . iterateGlobalReferences ( traceMap ) ) {
20
- if ( name === 'Object' ) {
21
- const { parent} = node ;
22
- if (
23
- parent . type === 'BinaryExpression'
24
- && ( parent . operator === '===' || parent . operator === '!==' )
25
- && ( parent . left === node || parent . right === node )
26
- ) {
27
- continue ;
28
- }
14
+ function enforceNewExpression ( { node, path : [ name ] } , sourceCode ) {
15
+ if ( name === 'Object' ) {
16
+ const { parent} = node ;
17
+ if (
18
+ parent . type === 'BinaryExpression'
19
+ && ( parent . operator === '===' || parent . operator === '!==' )
20
+ && ( parent . left === node || parent . right === node )
21
+ ) {
22
+ return ;
29
23
}
30
-
31
- yield {
32
- node,
33
- messageId : 'enforce' ,
34
- data : { name} ,
35
- fix : fixer => switchCallExpressionToNewExpression ( node , sourceCode , fixer ) ,
36
- } ;
37
24
}
25
+
26
+ return {
27
+ node,
28
+ messageId : 'enforce' ,
29
+ data : { name} ,
30
+ fix : fixer => switchCallExpressionToNewExpression ( node , sourceCode , fixer ) ,
31
+ } ;
38
32
}
39
33
40
- function * enforceCallExpression ( { sourceCode, tracker} ) {
41
- const traceMap = Object . fromEntries (
42
- builtins . disallowNew . map ( name => [ name , { [ ReferenceTracker . CONSTRUCT ] : true } ] ) ,
43
- ) ;
34
+ function enforceCallExpression ( { node, path : [ name ] } , sourceCode ) {
35
+ const problem = {
36
+ node,
37
+ messageId : 'disallow' ,
38
+ data : { name} ,
39
+ } ;
44
40
45
- for ( const { node, path : [ name ] } of tracker . iterateGlobalReferences ( traceMap ) ) {
46
- const problem = {
47
- node,
48
- messageId : 'disallow' ,
49
- data : { name} ,
41
+ if ( name !== 'String' && name !== 'Boolean' && name !== 'Number' ) {
42
+ problem . fix = function * ( fixer ) {
43
+ yield * switchNewExpressionToCallExpression ( node , sourceCode , fixer ) ;
50
44
} ;
51
-
52
- if ( name !== 'String' && name !== 'Boolean' && name !== 'Number' ) {
53
- problem . fix = function * ( fixer ) {
54
- yield * switchNewExpressionToCallExpression ( node , sourceCode , fixer ) ;
55
- } ;
56
- }
57
-
58
- yield problem ;
59
45
}
46
+
47
+ return problem ;
60
48
}
61
49
62
50
/** @param {import('eslint').Rule.RuleContext } context */
63
- const create = context => ( {
64
- * 'Program:exit' ( ) {
65
- const sourceCode = context . getSourceCode ( ) ;
66
- const tracker = new ReferenceTracker ( context . getScope ( ) ) ;
51
+ const create = context => {
52
+ const sourceCode = context . getSourceCode ( ) ;
53
+ const newExpressionTracker = new GlobalReferenceTracker ( {
54
+ objects : builtins . disallowNew ,
55
+ type : GlobalReferenceTracker . CONSTRUCT ,
56
+ handle : reference => enforceCallExpression ( reference , sourceCode ) ,
57
+ } ) ;
58
+ const callExpressionTracker = new GlobalReferenceTracker ( {
59
+ objects : builtins . enforceNew ,
60
+ type : GlobalReferenceTracker . CALL ,
61
+ handle : reference => enforceNewExpression ( reference , sourceCode ) ,
62
+ } ) ;
67
63
68
- yield * enforceNewExpression ( { sourceCode, tracker} ) ;
69
- yield * enforceCallExpression ( { sourceCode, tracker} ) ;
70
- } ,
71
- } ) ;
64
+ return {
65
+ * 'Program:exit' ( ) {
66
+ const scope = context . getScope ( ) ;
67
+
68
+ yield * newExpressionTracker . track ( scope ) ;
69
+ yield * callExpressionTracker . track ( scope ) ;
70
+ } ,
71
+ } ;
72
+ } ;
72
73
73
74
/** @type {import('eslint').Rule.RuleModule } */
74
75
module . exports = {
0 commit comments