@@ -64,7 +64,7 @@ function isComma (node) {
64
64
return node . type === 'Punctuator' && node . value === ','
65
65
}
66
66
67
- const ARITHMETIC_OPERATORS = [ '+' , '-' , '*' , '/' , '%' , '**' ]
67
+ const ARITHMETIC_OPERATORS = [ '+' , '-' , '*' , '/' , '%' , '**' /* es2016 */ ]
68
68
const BITWISE_OPERATORS = [ '&' , '|' , '^' , '~' , '<<' , '>>' , '>>>' ]
69
69
const COMPARISON_OPERATORS = [ '==' , '!=' , '===' , '!==' , '>' , '>=' , '<' , '<=' ]
70
70
const RELATIONAL_OPERATORS = [ 'in' , 'instanceof' ]
@@ -74,7 +74,7 @@ const ALL_BINARY_OPERATORS = [].concat(
74
74
COMPARISON_OPERATORS ,
75
75
RELATIONAL_OPERATORS
76
76
)
77
- const LOGICAL_OPERATORS = [ '&&' , '||' ]
77
+ const LOGICAL_OPERATORS = [ '&&' , '||' , '??' /* es2020 */ ]
78
78
79
79
/*
80
80
* Result `true` if the node is sure that there are no side effects
@@ -94,17 +94,15 @@ const LOGICAL_OPERATORS = ['&&', '||']
94
94
*/
95
95
function isNotSideEffectsNode ( node , visitorKeys ) {
96
96
let result = true
97
- const noSideEffectsNodes = new Set ( )
97
+ let skipNode = false
98
98
traverseNodes ( node , {
99
99
visitorKeys,
100
- enterNode ( node , parent ) {
101
- if ( ! result ) {
100
+ enterNode ( node ) {
101
+ if ( ! result || skipNode ) {
102
102
return
103
103
}
104
104
105
105
if (
106
- // parent has no side effects
107
- noSideEffectsNodes . has ( parent ) ||
108
106
// no side effects node
109
107
node . type === 'FunctionExpression' ||
110
108
node . type === 'Identifier' ||
@@ -113,7 +111,7 @@ function isNotSideEffectsNode (node, visitorKeys) {
113
111
node . type === 'ArrowFunctionExpression' ||
114
112
node . type === 'TemplateElement'
115
113
) {
116
- noSideEffectsNodes . add ( node )
114
+ skipNode = node
117
115
} else if (
118
116
node . type !== 'Property' &&
119
117
node . type !== 'ObjectExpression' &&
@@ -131,7 +129,11 @@ function isNotSideEffectsNode (node, visitorKeys) {
131
129
result = false
132
130
}
133
131
} ,
134
- leaveNode ( ) { }
132
+ leaveNode ( node ) {
133
+ if ( skipNode === node ) {
134
+ skipNode = null
135
+ }
136
+ }
135
137
} )
136
138
137
139
return result
0 commit comments