@@ -128,6 +128,7 @@ impl<'a> PeepholeOptimizations {
128
128
. unwrap_or_else ( || Expression :: UnaryExpression ( ctx. ast . alloc ( unary) ) )
129
129
}
130
130
131
+ /// `MaybeSimplifyNot`: <https://github.com/evanw/esbuild/blob/v0.24.2/internal/js_ast/js_ast_helpers.go#L73>
131
132
fn try_minimize_not (
132
133
expr : & mut UnaryExpression < ' a > ,
133
134
ctx : Ctx < ' a , ' _ > ,
@@ -136,15 +137,22 @@ impl<'a> PeepholeOptimizations {
136
137
return None ;
137
138
}
138
139
match & mut expr. argument {
140
+ // `!!true` -> `true`
141
+ // `!!false` -> `false`
139
142
Expression :: UnaryExpression ( e)
140
143
if e. operator . is_not ( ) && ValueType :: from ( & e. argument ) . is_boolean ( ) =>
141
144
{
142
145
Some ( ctx. ast . move_expression ( & mut e. argument ) )
143
146
}
147
+ // `!(a == b)` => `a != b`
148
+ // `!(a != b)` => `a == b`
149
+ // `!(a === b)` => `a !== b`
150
+ // `!(a !== b)` => `a === b`
144
151
Expression :: BinaryExpression ( e) if e. operator . is_equality ( ) => {
145
152
e. operator = e. operator . equality_inverse_operator ( ) . unwrap ( ) ;
146
153
Some ( ctx. ast . move_expression ( & mut expr. argument ) )
147
154
}
155
+ // `!(a == b ? foo: bar)` => `a != b ? foo : bar`
148
156
Expression :: ConditionalExpression ( conditional_expr) => {
149
157
if let Expression :: BinaryExpression ( e) = & mut conditional_expr. test {
150
158
if e. operator . is_equality ( ) {
@@ -154,6 +162,17 @@ impl<'a> PeepholeOptimizations {
154
162
}
155
163
None
156
164
}
165
+ // "!(a, b)" => "a, !b"
166
+ Expression :: SequenceExpression ( sequence_expr) => {
167
+ if let Some ( e) = sequence_expr. expressions . pop ( ) {
168
+ let e = ctx. ast . expression_unary ( e. span ( ) , UnaryOperator :: LogicalNot , e) ;
169
+ let expressions = ctx. ast . vec_from_iter (
170
+ sequence_expr. expressions . drain ( ..) . chain ( std:: iter:: once ( e) ) ,
171
+ ) ;
172
+ return Some ( ctx. ast . expression_sequence ( sequence_expr. span , expressions) ) ;
173
+ }
174
+ None
175
+ }
157
176
_ => None ,
158
177
}
159
178
}
@@ -2310,6 +2329,7 @@ mod test {
2310
2329
test ( "!!!delete x.y" , "!delete x.y" ) ;
2311
2330
test ( "!!!!delete x.y" , "delete x.y" ) ;
2312
2331
test ( "var k = !!(foo instanceof bar)" , "var k = foo instanceof bar" ) ;
2332
+ test ( "!(a, b)" , "a, !b" ) ;
2313
2333
}
2314
2334
2315
2335
#[ test]
0 commit comments