1
1
use std:: vec:: Vec ;
2
2
3
+ use swc_common:: util:: take:: Take ;
3
4
use swc_ecma_ast:: * ;
4
5
use swc_ecma_transforms_base:: perf:: { Parallel , ParallelExt } ;
6
+ use swc_ecma_utils:: { ExprCtx , ExprExt , Value :: Known } ;
5
7
use swc_ecma_visit:: { noop_visit_mut_type, VisitMut , VisitMutWith } ;
6
8
7
- use crate :: HEAVY_TASK_PARALLELS ;
9
+ use crate :: CPU_COUNT ;
8
10
9
11
/// Optimizer invoked before invoking compressor.
10
12
///
11
13
/// - Remove parens.
12
14
///
13
15
/// TODO: remove completely after #8333
14
- pub ( crate ) fn precompress_optimizer < ' a > ( ) -> impl ' a + VisitMut {
15
- PrecompressOptimizer { }
16
+ pub ( crate ) fn precompress_optimizer < ' a > ( expr_ctx : ExprCtx ) -> impl ' a + VisitMut {
17
+ PrecompressOptimizer { expr_ctx }
16
18
}
17
19
18
20
#[ derive( Debug ) ]
19
- pub ( crate ) struct PrecompressOptimizer { }
21
+ pub ( crate ) struct PrecompressOptimizer {
22
+ expr_ctx : ExprCtx ,
23
+ }
24
+
25
+ impl PrecompressOptimizer {
26
+ /// Drops RHS from `null && foo`
27
+ fn optimize_bin_expr ( & mut self , n : & mut Expr ) {
28
+ let Expr :: Bin ( b) = n else {
29
+ return ;
30
+ } ;
31
+
32
+ if b. op == op ! ( "&&" ) && b. left . as_pure_bool ( & self . expr_ctx ) == Known ( false ) {
33
+ * n = * b. left . take ( ) ;
34
+ return ;
35
+ }
36
+
37
+ if b. op == op ! ( "||" ) && b. left . as_pure_bool ( & self . expr_ctx ) == Known ( true ) {
38
+ * n = * b. left . take ( ) ;
39
+ }
40
+ }
41
+ }
20
42
21
43
impl Parallel for PrecompressOptimizer {
22
44
fn create ( & self ) -> Self {
23
- Self { }
45
+ Self {
46
+ expr_ctx : self . expr_ctx . clone ( ) ,
47
+ }
24
48
}
25
49
26
50
fn merge ( & mut self , _: Self ) { }
@@ -29,38 +53,44 @@ impl Parallel for PrecompressOptimizer {
29
53
impl VisitMut for PrecompressOptimizer {
30
54
noop_visit_mut_type ! ( ) ;
31
55
56
+ fn visit_mut_expr ( & mut self , n : & mut Expr ) {
57
+ n. visit_mut_children_with ( self ) ;
58
+
59
+ self . optimize_bin_expr ( n) ;
60
+ }
61
+
32
62
fn visit_mut_stmts ( & mut self , n : & mut Vec < Stmt > ) {
33
- self . maybe_par ( * HEAVY_TASK_PARALLELS , n, |v, n| {
63
+ self . maybe_par ( * CPU_COUNT , n, |v, n| {
34
64
n. visit_mut_with ( v) ;
35
65
} ) ;
36
66
}
37
67
38
68
fn visit_mut_module_items ( & mut self , n : & mut Vec < ModuleItem > ) {
39
- self . maybe_par ( * HEAVY_TASK_PARALLELS , n, |v, n| {
69
+ self . maybe_par ( * CPU_COUNT , n, |v, n| {
40
70
n. visit_mut_with ( v) ;
41
71
} ) ;
42
72
}
43
73
44
74
fn visit_mut_exprs ( & mut self , n : & mut Vec < Box < Expr > > ) {
45
- self . maybe_par ( * HEAVY_TASK_PARALLELS , n, |v, n| {
75
+ self . maybe_par ( * CPU_COUNT , n, |v, n| {
46
76
n. visit_mut_with ( v) ;
47
77
} ) ;
48
78
}
49
79
50
80
fn visit_mut_opt_vec_expr_or_spreads ( & mut self , n : & mut Vec < Option < ExprOrSpread > > ) {
51
- self . maybe_par ( * HEAVY_TASK_PARALLELS , n, |v, n| {
81
+ self . maybe_par ( * CPU_COUNT , n, |v, n| {
52
82
n. visit_mut_with ( v) ;
53
83
} ) ;
54
84
}
55
85
56
86
fn visit_mut_expr_or_spreads ( & mut self , n : & mut Vec < ExprOrSpread > ) {
57
- self . maybe_par ( * HEAVY_TASK_PARALLELS , n, |v, n| {
87
+ self . maybe_par ( * CPU_COUNT , n, |v, n| {
58
88
n. visit_mut_with ( v) ;
59
89
} ) ;
60
90
}
61
91
62
92
fn visit_mut_var_declarators ( & mut self , n : & mut Vec < VarDeclarator > ) {
63
- self . maybe_par ( * HEAVY_TASK_PARALLELS , n, |v, n| {
93
+ self . maybe_par ( * CPU_COUNT , n, |v, n| {
64
94
n. visit_mut_with ( v) ;
65
95
} ) ;
66
96
}
0 commit comments