@@ -64,7 +64,7 @@ function isComma (node) {
6464 return node . type === 'Punctuator' && node . value === ','
6565}
6666
67- const ARITHMETIC_OPERATORS = [ '+' , '-' , '*' , '/' , '%' , '**' ]
67+ const ARITHMETIC_OPERATORS = [ '+' , '-' , '*' , '/' , '%' , '**' /* es2016 */ ]
6868const BITWISE_OPERATORS = [ '&' , '|' , '^' , '~' , '<<' , '>>' , '>>>' ]
6969const COMPARISON_OPERATORS = [ '==' , '!=' , '===' , '!==' , '>' , '>=' , '<' , '<=' ]
7070const RELATIONAL_OPERATORS = [ 'in' , 'instanceof' ]
@@ -74,7 +74,7 @@ const ALL_BINARY_OPERATORS = [].concat(
7474 COMPARISON_OPERATORS ,
7575 RELATIONAL_OPERATORS
7676)
77- const LOGICAL_OPERATORS = [ '&&' , '||' ]
77+ const LOGICAL_OPERATORS = [ '&&' , '||' , '??' /* es2020 */ ]
7878
7979/*
8080 * Result `true` if the node is sure that there are no side effects
@@ -94,17 +94,15 @@ const LOGICAL_OPERATORS = ['&&', '||']
9494 */
9595function isNotSideEffectsNode ( node , visitorKeys ) {
9696 let result = true
97- const noSideEffectsNodes = new Set ( )
97+ let skipNode = false
9898 traverseNodes ( node , {
9999 visitorKeys,
100- enterNode ( node , parent ) {
101- if ( ! result ) {
100+ enterNode ( node ) {
101+ if ( ! result || skipNode ) {
102102 return
103103 }
104104
105105 if (
106- // parent has no side effects
107- noSideEffectsNodes . has ( parent ) ||
108106 // no side effects node
109107 node . type === 'FunctionExpression' ||
110108 node . type === 'Identifier' ||
@@ -113,7 +111,7 @@ function isNotSideEffectsNode (node, visitorKeys) {
113111 node . type === 'ArrowFunctionExpression' ||
114112 node . type === 'TemplateElement'
115113 ) {
116- noSideEffectsNodes . add ( node )
114+ skipNode = node
117115 } else if (
118116 node . type !== 'Property' &&
119117 node . type !== 'ObjectExpression' &&
@@ -131,7 +129,11 @@ function isNotSideEffectsNode (node, visitorKeys) {
131129 result = false
132130 }
133131 } ,
134- leaveNode ( ) { }
132+ leaveNode ( node ) {
133+ if ( skipNode === node ) {
134+ skipNode = null
135+ }
136+ }
135137 } )
136138
137139 return result
0 commit comments