Skip to content

Commit

Permalink
fix(es/fixer): Preserve parens in optional calls (#4923)
Browse files Browse the repository at this point in the history
  • Loading branch information
Austaras committed Jun 10, 2022
1 parent 93f7f13 commit 5bb417e
Showing 1 changed file with 43 additions and 22 deletions.
65 changes: 43 additions & 22 deletions crates/swc_ecma_transforms_base/src/fixer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,37 @@ macro_rules! array {
};
}

impl Fixer<'_> {
fn visit_call<T: VisitMutWith<Self>>(
&mut self,
args: &mut Vec<ExprOrSpread>,
callee: &mut T,
) -> Context {
let old = self.ctx;
self.ctx = Context::ForcedExpr;
args.visit_mut_with(self);
self.ctx = old;

let old = self.ctx;
self.ctx = Context::Callee { is_new: false };
callee.visit_mut_with(self);

old
}

fn wrap_callee(&mut self, e: &mut Expr) {
if match e {
Expr::Lit(Lit::Num(..) | Lit::Str(..)) => false,
Expr::Cond(..) | Expr::Bin(..) | Expr::Lit(..) | Expr::Unary(..) | Expr::Object(..) => {
true
}
_ => false,
} {
self.wrap(e)
}
}
}

impl VisitMut for Fixer<'_> {
noop_visit_mut_type!();

Expand Down Expand Up @@ -328,30 +359,18 @@ impl VisitMut for Fixer<'_> {
}

fn visit_mut_call_expr(&mut self, node: &mut CallExpr) {
let old = self.ctx;
self.ctx = Context::ForcedExpr;
node.args.visit_mut_with(self);
let old = self.visit_call(&mut node.args, &mut node.callee);
if let Callee::Expr(e) = &mut node.callee {
self.wrap_callee(&mut **e)
}

self.ctx = old;
}

let old = self.ctx;
self.ctx = Context::Callee { is_new: false };
node.callee.visit_mut_with(self);
match &mut node.callee {
Callee::Expr(e)
if match &**e {
Expr::Lit(Lit::Num(..) | Lit::Str(..)) => false,
Expr::Cond(..)
| Expr::Bin(..)
| Expr::Lit(..)
| Expr::Unary(..)
| Expr::Object(..) => true,
_ => false,
} =>
{
self.wrap(&mut **e);
}
_ => {}
}
fn visit_mut_opt_call(&mut self, node: &mut OptCall) {
let old = self.visit_call(&mut node.args, &mut node.callee);

self.wrap_callee(&mut *node.callee);

self.ctx = old;
}
Expand Down Expand Up @@ -1587,4 +1606,6 @@ var store = global[SHARED] || (global[SHARED] = {});
identical!(issue_2550_2, "({ isNewPrefsActive } && { a: 1 })");

identical!(issue_4761, "x = { ...(0, foo) }");

identical!(issue_4914, "(a ?? b)?.()");
}

1 comment on commit 5bb417e

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 5bb417e Previous: d669454 Ratio
es/full/minify/libraries/antd 2555952428 ns/iter (± 11259122) 2291780455 ns/iter (± 66331000) 1.12
es/full/minify/libraries/d3 629749257 ns/iter (± 12426696) 575894832 ns/iter (± 8014476) 1.09
es/full/minify/libraries/echarts 2898365097 ns/iter (± 9299783) 2795207622 ns/iter (± 11585444) 1.04
es/full/minify/libraries/jquery 116629672 ns/iter (± 8654481) 124082059 ns/iter (± 2078214) 0.94
es/full/minify/libraries/lodash 171076887 ns/iter (± 5028230) 180881674 ns/iter (± 513966) 0.95
es/full/minify/libraries/moment 65185182 ns/iter (± 829827) 73280876 ns/iter (± 544217) 0.89
es/full/minify/libraries/react 20627522 ns/iter (± 133650) 23674139 ns/iter (± 251738) 0.87
es/full/minify/libraries/terser 605599482 ns/iter (± 10631162) 564693726 ns/iter (± 9848645) 1.07
es/full/minify/libraries/three 864793215 ns/iter (± 6209125) 758953014 ns/iter (± 12408753) 1.14
es/full/minify/libraries/typescript 5820515322 ns/iter (± 34636969) 5312741517 ns/iter (± 21100305) 1.10
es/full/minify/libraries/victory 1191687819 ns/iter (± 11883582) 1029007352 ns/iter (± 20458339) 1.16
es/full/minify/libraries/vue 188804105 ns/iter (± 8993503) 189454695 ns/iter (± 2653824) 1.00
es/full/codegen/es3 34637 ns/iter (± 141) 40028 ns/iter (± 471) 0.87
es/full/codegen/es5 34593 ns/iter (± 160) 39851 ns/iter (± 495) 0.87
es/full/codegen/es2015 34591 ns/iter (± 126) 39828 ns/iter (± 531) 0.87
es/full/codegen/es2016 34603 ns/iter (± 193) 39842 ns/iter (± 574) 0.87
es/full/codegen/es2017 34612 ns/iter (± 170) 39341 ns/iter (± 796) 0.88
es/full/codegen/es2018 34589 ns/iter (± 127) 39842 ns/iter (± 360) 0.87
es/full/codegen/es2019 34565 ns/iter (± 185) 39328 ns/iter (± 777) 0.88
es/full/codegen/es2020 34596 ns/iter (± 149) 39252 ns/iter (± 883) 0.88
es/full/all/es3 196065726 ns/iter (± 823056) 223406174 ns/iter (± 2313413) 0.88
es/full/all/es5 186101109 ns/iter (± 1050325) 212035435 ns/iter (± 2676605) 0.88
es/full/all/es2015 148328503 ns/iter (± 823789) 167262502 ns/iter (± 2303101) 0.89
es/full/all/es2016 147216129 ns/iter (± 966197) 166175850 ns/iter (± 2001300) 0.89
es/full/all/es2017 146360313 ns/iter (± 893545) 165263794 ns/iter (± 1995790) 0.89
es/full/all/es2018 144243937 ns/iter (± 714171) 162905906 ns/iter (± 2248921) 0.89
es/full/all/es2019 144000126 ns/iter (± 849381) 162234200 ns/iter (± 2134897) 0.89
es/full/all/es2020 139352743 ns/iter (± 743856) 155717067 ns/iter (± 1810364) 0.89
es/full/parser 597784 ns/iter (± 95659) 676346 ns/iter (± 65485) 0.88
es/full/base/fixer 26925 ns/iter (± 256) 32268 ns/iter (± 454) 0.83
es/full/base/resolver_and_hygiene 143394 ns/iter (± 1940) 161984 ns/iter (± 5474) 0.89
serialization of ast node 178 ns/iter (± 0) 210 ns/iter (± 5) 0.85
serialization of serde 180 ns/iter (± 0) 212 ns/iter (± 4) 0.85

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.