2
2
use rayon:: prelude:: * ;
3
3
use swc_common:: { util:: take:: Take , EqIgnoreSpan , Spanned , DUMMY_SP } ;
4
4
use swc_ecma_ast:: * ;
5
- use swc_ecma_utils:: { extract_var_ids, ExprExt , StmtExt , StmtLike , Value } ;
5
+ use swc_ecma_utils:: { extract_var_ids, ExprCtx , ExprExt , StmtExt , StmtLike , Value } ;
6
6
use swc_ecma_visit:: { noop_visit_type, Visit , VisitWith } ;
7
7
8
8
use super :: Pure ;
9
- use crate :: {
10
- compress:: util:: is_fine_for_if_cons,
11
- maybe_par,
12
- util:: { contains_await_or_yield, ModuleItemExt } ,
13
- } ;
9
+ use crate :: { compress:: util:: is_fine_for_if_cons, maybe_par, util:: ModuleItemExt } ;
14
10
15
11
/// Methods related to option `dead_code`.
16
12
impl Pure < ' _ > {
@@ -289,11 +285,7 @@ impl Pure<'_> {
289
285
_ => return ,
290
286
} ;
291
287
292
- if contains_await_or_yield ( last) {
293
- return ;
294
- }
295
-
296
- fn drop < T : StmtLike > ( stmt : & mut T , last : & Stmt , need_break : bool ) -> bool {
288
+ fn drop < T : StmtLike > ( stmt : & mut T , last : & Stmt , need_break : bool , ctx : & ExprCtx ) -> bool {
297
289
match stmt. as_stmt_mut ( ) {
298
290
Some ( s) if s. eq_ignore_span ( last) => {
299
291
if need_break {
@@ -308,26 +300,37 @@ impl Pure<'_> {
308
300
}
309
301
Some ( Stmt :: If ( i) ) => {
310
302
let mut changed = false ;
311
- changed |= drop ( & mut * i. cons , last, need_break) ;
303
+ changed |= drop ( & mut * i. cons , last, need_break, ctx ) ;
312
304
if let Some ( alt) = i. alt . as_mut ( ) {
313
- changed |= drop ( & mut * * alt, last, need_break) ;
305
+ changed |= drop ( & mut * * alt, last, need_break, ctx ) ;
314
306
}
315
307
changed
316
308
}
317
- Some ( Stmt :: Try ( t) ) if !last . is_throw ( ) => {
309
+ Some ( Stmt :: Try ( t) ) => {
318
310
let mut changed = false ;
311
+ // TODO: let chain
319
312
if let Some ( stmt) = t. block . stmts . last_mut ( ) {
320
- changed |= drop ( stmt, last, need_break)
313
+ let side_effect = match last {
314
+ Stmt :: Break ( _) | Stmt :: Continue ( _) => false ,
315
+ Stmt :: Return ( ReturnStmt { arg : None , .. } ) => false ,
316
+ Stmt :: Return ( ReturnStmt { arg : Some ( arg) , .. } ) => {
317
+ arg. may_have_side_effects ( ctx)
318
+ }
319
+ Stmt :: Throw ( _) => true ,
320
+ _ => unreachable ! ( ) ,
321
+ } ;
322
+ if t. finalizer . is_none ( ) && !side_effect {
323
+ changed |= drop ( stmt, last, need_break, ctx)
324
+ }
321
325
}
322
- // TODO: let chain
323
326
if let Some ( h) = t. handler . as_mut ( ) {
324
327
if let Some ( stmt) = h. body . stmts . last_mut ( ) {
325
- changed |= drop ( stmt, last, need_break) ;
328
+ changed |= drop ( stmt, last, need_break, ctx ) ;
326
329
}
327
330
}
328
331
if let Some ( f) = t. finalizer . as_mut ( ) {
329
332
if let Some ( stmt) = f. stmts . last_mut ( ) {
330
- changed |= drop ( stmt, last, need_break) ;
333
+ changed |= drop ( stmt, last, need_break, ctx ) ;
331
334
}
332
335
}
333
336
changed
@@ -336,7 +339,7 @@ impl Pure<'_> {
336
339
let mut changed = false ;
337
340
for case in s. cases . iter_mut ( ) {
338
341
for stmt in case. cons . iter_mut ( ) {
339
- changed |= drop ( stmt, last, true ) ;
342
+ changed |= drop ( stmt, last, true , ctx ) ;
340
343
}
341
344
}
342
345
@@ -352,16 +355,16 @@ impl Pure<'_> {
352
355
if let Stmt :: Block ( b) = & mut * * body {
353
356
let mut changed = false ;
354
357
for stmt in b. stmts . iter_mut ( ) {
355
- changed |= drop ( stmt, last, true ) ;
358
+ changed |= drop ( stmt, last, true , ctx ) ;
356
359
}
357
360
changed
358
361
} else {
359
- drop ( & mut * * body, last, true )
362
+ drop ( & mut * * body, last, true , ctx )
360
363
}
361
364
}
362
365
Some ( Stmt :: Block ( b) ) => {
363
366
if let Some ( stmt) = b. stmts . last_mut ( ) {
364
- drop ( stmt, last, need_break)
367
+ drop ( stmt, last, need_break, ctx )
365
368
} else {
366
369
false
367
370
}
@@ -371,7 +374,7 @@ impl Pure<'_> {
371
374
}
372
375
373
376
if let Some ( before_last) = stmts. last_mut ( ) {
374
- if drop ( before_last, last, false ) {
377
+ if drop ( before_last, last, false , & self . expr_ctx ) {
375
378
self . changed = true ;
376
379
377
380
report_change ! ( "Dropping control keyword in nested block" ) ;
0 commit comments