Skip to content

Commit

Permalink
fix(es/visit): Fix handling of Program of AndThen (#7120)
Browse files Browse the repository at this point in the history
  • Loading branch information
JSerFeng committed Mar 22, 2023
1 parent 8c5a1f1 commit d50689e
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 0 deletions.
40 changes: 40 additions & 0 deletions crates/swc_ecma_visit/src/lib.rs
Expand Up @@ -20,6 +20,12 @@ where

B: Fold,
{
#[inline(always)]
fn fold_program(&mut self, n: Program) -> Program {
let n = self.first.fold_program(n);
self.second.fold_program(n)
}

#[inline(always)]
fn fold_module(&mut self, n: Module) -> Module {
let n = self.first.fold_module(n);
Expand All @@ -38,6 +44,11 @@ where
A: VisitMut,
B: VisitMut,
{
fn visit_mut_program(&mut self, n: &mut Program) {
self.first.visit_mut_program(n);
self.second.visit_mut_program(n);
}

fn visit_mut_module(&mut self, n: &mut Module) {
self.first.visit_mut_module(n);
self.second.visit_mut_module(n)
Expand All @@ -54,6 +65,11 @@ where
A: Visit,
B: Visit,
{
fn visit_program(&mut self, n: &Program) {
self.first.visit_program(n);
self.second.visit_program(n);
}

fn visit_module(&mut self, n: &Module) {
self.first.visit_module(n);
self.second.visit_module(n);
Expand All @@ -69,6 +85,19 @@ impl<V> Fold for Repeat<V>
where
V: Fold + Repeated,
{
fn fold_program(&mut self, mut node: Program) -> Program {
loop {
self.pass.reset();
node = node.fold_with(&mut self.pass);

if !self.pass.changed() {
break;
}
}

node
}

fn fold_module(&mut self, mut node: Module) -> Module {
loop {
self.pass.reset();
Expand Down Expand Up @@ -100,6 +129,17 @@ impl<V> VisitMut for Repeat<V>
where
V: VisitMut + Repeated,
{
fn visit_mut_program(&mut self, node: &mut Program) {
loop {
self.pass.reset();
node.visit_mut_with(&mut self.pass);

if !self.pass.changed() {
break;
}
}
}

fn visit_mut_module(&mut self, node: &mut Module) {
loop {
self.pass.reset();
Expand Down
31 changes: 31 additions & 0 deletions crates/swc_ecma_visit/tests/main.rs
@@ -0,0 +1,31 @@
use swc_common::{chain, DUMMY_SP};
use swc_ecma_ast::{Module, Program};
use swc_ecma_visit::{Visit, VisitWith};

#[test]
fn should_visit_program() {
struct Pass1<'a>(&'a mut usize);
struct Pass2;

impl<'a> Visit for Pass1<'a> {
fn visit_program(&mut self, _program: &Program) {
*self.0 += 1;
}
}

impl Visit for Pass2 {}

let n = Program::Module(Module {
span: DUMMY_SP,
body: vec![],
shebang: None,
});

let mut counter = 0;
let p1 = Pass1(&mut counter);
let p2 = Pass2;
let mut pass = chain!(p1, p2);
n.visit_with(&mut pass);

assert_eq!(counter, 1);
}

1 comment on commit d50689e

@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: d50689e Previous: 6d9763e Ratio
es/full/bugs-1 302346 ns/iter (± 22348) 294792 ns/iter (± 8692) 1.03
es/full/minify/libraries/antd 1493029808 ns/iter (± 10259250) 1636485310 ns/iter (± 19211180) 0.91
es/full/minify/libraries/d3 290961039 ns/iter (± 4702439) 299706338 ns/iter (± 4528581) 0.97
es/full/minify/libraries/echarts 1162218856 ns/iter (± 13702972) 1227852490 ns/iter (± 9988016) 0.95
es/full/minify/libraries/jquery 89076585 ns/iter (± 696229) 89557235 ns/iter (± 518929) 0.99
es/full/minify/libraries/lodash 102946416 ns/iter (± 988108) 105039736 ns/iter (± 950168) 0.98
es/full/minify/libraries/moment 51229014 ns/iter (± 277945) 52120501 ns/iter (± 479065) 0.98
es/full/minify/libraries/react 18857335 ns/iter (± 69067) 18954445 ns/iter (± 121474) 0.99
es/full/minify/libraries/terser 237085100 ns/iter (± 2422916) 244169630 ns/iter (± 1616264) 0.97
es/full/minify/libraries/three 410755373 ns/iter (± 4675368) 440597634 ns/iter (± 5181987) 0.93
es/full/minify/libraries/typescript 2848573413 ns/iter (± 20581620) 3092986821 ns/iter (± 19635304) 0.92
es/full/minify/libraries/victory 617902093 ns/iter (± 10956438) 664834940 ns/iter (± 9001330) 0.93
es/full/minify/libraries/vue 127505099 ns/iter (± 854231) 130773228 ns/iter (± 1284448) 0.98
es/full/codegen/es3 26576 ns/iter (± 110) 26663 ns/iter (± 75) 1.00
es/full/codegen/es5 26648 ns/iter (± 71) 26815 ns/iter (± 106) 0.99
es/full/codegen/es2015 26415 ns/iter (± 123) 26818 ns/iter (± 47) 0.98
es/full/codegen/es2016 26521 ns/iter (± 113) 26767 ns/iter (± 51) 0.99
es/full/codegen/es2017 26362 ns/iter (± 160) 26791 ns/iter (± 39) 0.98
es/full/codegen/es2018 26356 ns/iter (± 96) 26843 ns/iter (± 70) 0.98
es/full/codegen/es2019 26424 ns/iter (± 189) 26825 ns/iter (± 63) 0.99
es/full/codegen/es2020 26407 ns/iter (± 207) 26809 ns/iter (± 64) 0.99
es/full/all/es3 181671721 ns/iter (± 2953735) 182181569 ns/iter (± 2545629) 1.00
es/full/all/es5 172273484 ns/iter (± 3431854) 172512583 ns/iter (± 3312106) 1.00
es/full/all/es2015 136774789 ns/iter (± 1967896) 136990129 ns/iter (± 1538485) 1.00
es/full/all/es2016 135549168 ns/iter (± 1566014) 133809188 ns/iter (± 2725141) 1.01
es/full/all/es2017 134303317 ns/iter (± 1952082) 133201251 ns/iter (± 1635445) 1.01
es/full/all/es2018 129167147 ns/iter (± 2624101) 128644649 ns/iter (± 2317575) 1.00
es/full/all/es2019 128172715 ns/iter (± 2311319) 127822448 ns/iter (± 1628042) 1.00
es/full/all/es2020 117851741 ns/iter (± 767862) 119083468 ns/iter (± 1311019) 0.99
es/full/parser 527427 ns/iter (± 7707) 532861 ns/iter (± 8529) 0.99
es/full/base/fixer 23548 ns/iter (± 171) 22066 ns/iter (± 50) 1.07
es/full/base/resolver_and_hygiene 83548 ns/iter (± 442) 82280 ns/iter (± 265) 1.02
serialization of ast node 123 ns/iter (± 0) 124 ns/iter (± 1) 0.99
serialization of serde 125 ns/iter (± 0) 127 ns/iter (± 0) 0.98
css/minify/libraries/bootstrap 28023524 ns/iter (± 125601) 28433894 ns/iter (± 129566) 0.99
css/visitor/compare/clone 2056060 ns/iter (± 14831) 2103256 ns/iter (± 11933) 0.98
css/visitor/compare/visit_mut_span 2250148 ns/iter (± 25994) 2284649 ns/iter (± 7592) 0.98
css/visitor/compare/visit_mut_span_panic 2282428 ns/iter (± 12347) 2371497 ns/iter (± 38970) 0.96
css/visitor/compare/fold_span 3008825 ns/iter (± 31157) 3089656 ns/iter (± 21659) 0.97
css/visitor/compare/fold_span_panic 3165960 ns/iter (± 31324) 3204298 ns/iter (± 21575) 0.99
css/lexer/bootstrap_5_1_3 5072462 ns/iter (± 11923) 5107644 ns/iter (± 7300) 0.99
css/lexer/foundation_6_7_4 4272425 ns/iter (± 26028) 4310392 ns/iter (± 21208) 0.99
css/lexer/tailwind_3_1_1 810431 ns/iter (± 5731) 816063 ns/iter (± 2974) 0.99
css/parser/bootstrap_5_1_3 21535820 ns/iter (± 166825) 21908482 ns/iter (± 85971) 0.98
css/parser/foundation_6_7_4 17104856 ns/iter (± 87729) 17405984 ns/iter (± 58679) 0.98
css/parser/tailwind_3_1_1 3317039 ns/iter (± 18373) 3354250 ns/iter (± 8071) 0.99
es/codegen/colors 324054 ns/iter (± 183159) 327358 ns/iter (± 184774) 0.99
es/codegen/large 1161727 ns/iter (± 606627) 1207352 ns/iter (± 615510) 0.96
es/codegen/with-parser/colors 46706 ns/iter (± 362) 46786 ns/iter (± 225) 1.00
es/codegen/with-parser/large 512422 ns/iter (± 2321) 520005 ns/iter (± 1523) 0.99
es/minify/libraries/antd 1312178875 ns/iter (± 12054356) 1409765201 ns/iter (± 12111197) 0.93
es/minify/libraries/d3 243499234 ns/iter (± 2512296) 262948367 ns/iter (± 3148450) 0.93
es/minify/libraries/echarts 979667194 ns/iter (± 8089462) 1093902891 ns/iter (± 14164344) 0.90
es/minify/libraries/jquery 76633744 ns/iter (± 489088) 79071891 ns/iter (± 478849) 0.97
es/minify/libraries/lodash 92012410 ns/iter (± 735749) 95564818 ns/iter (± 479153) 0.96
es/minify/libraries/moment 44765857 ns/iter (± 219756) 46052848 ns/iter (± 242089) 0.97
es/minify/libraries/react 16700777 ns/iter (± 113893) 17062332 ns/iter (± 57505) 0.98
es/minify/libraries/terser 202829056 ns/iter (± 2688596) 211035135 ns/iter (± 1345431) 0.96
es/minify/libraries/three 337905586 ns/iter (± 4616802) 371088341 ns/iter (± 4289014) 0.91
es/minify/libraries/typescript 2412247148 ns/iter (± 15842881) 2632948971 ns/iter (± 5676888) 0.92
es/minify/libraries/victory 515372570 ns/iter (± 5357179) 600225162 ns/iter (± 8288276) 0.86
es/minify/libraries/vue 111846714 ns/iter (± 1358470) 116677725 ns/iter (± 1233421) 0.96
es/visitor/compare/clone 2279343 ns/iter (± 25743) 2318201 ns/iter (± 19068) 0.98
es/visitor/compare/visit_mut_span 2639929 ns/iter (± 14670) 2661323 ns/iter (± 7688) 0.99
es/visitor/compare/visit_mut_span_panic 2698631 ns/iter (± 9537) 2703329 ns/iter (± 9033) 1.00
es/visitor/compare/fold_span 3759974 ns/iter (± 18095) 3780523 ns/iter (± 15571) 0.99
es/visitor/compare/fold_span_panic 3903049 ns/iter (± 14360) 3925816 ns/iter (± 12460) 0.99
es/lexer/colors 15324 ns/iter (± 82) 15399 ns/iter (± 12) 1.00
es/lexer/angular 7309904 ns/iter (± 34368) 7399315 ns/iter (± 7875) 0.99
es/lexer/backbone 980702 ns/iter (± 3614) 987351 ns/iter (± 522) 0.99
es/lexer/jquery 5517005 ns/iter (± 45851) 5556336 ns/iter (± 4400) 0.99
es/lexer/jquery mobile 8421544 ns/iter (± 42110) 8556375 ns/iter (± 4849) 0.98
es/lexer/mootools 4352364 ns/iter (± 27506) 4410428 ns/iter (± 11005) 0.99
es/lexer/underscore 819948 ns/iter (± 4643) 832504 ns/iter (± 517) 0.98
es/lexer/three 25739524 ns/iter (± 154602) 26154534 ns/iter (± 37513) 0.98
es/lexer/yui 4620799 ns/iter (± 16325) 4653380 ns/iter (± 5278) 0.99
es/parser/colors 28981 ns/iter (± 151) 29164 ns/iter (± 46) 0.99
es/parser/angular 14889287 ns/iter (± 136051) 17152675 ns/iter (± 285922) 0.87
es/parser/backbone 2181746 ns/iter (± 12229) 2280165 ns/iter (± 21192) 0.96
es/parser/jquery 11951947 ns/iter (± 98360) 13850924 ns/iter (± 423405) 0.86
es/parser/jquery mobile 18513662 ns/iter (± 159268) 21727797 ns/iter (± 377531) 0.85
es/parser/mootools 9160362 ns/iter (± 40936) 10070037 ns/iter (± 101046) 0.91
es/parser/underscore 1848937 ns/iter (± 15532) 1900777 ns/iter (± 8524) 0.97
es/parser/three 52871480 ns/iter (± 893039) 56601175 ns/iter (± 497544) 0.93
es/parser/yui 9074301 ns/iter (± 58403) 9253553 ns/iter (± 72728) 0.98
es/preset-env/usage/builtin_type 138929 ns/iter (± 32613) 143235 ns/iter (± 34211) 0.97
es/preset-env/usage/property 20396 ns/iter (± 117) 21418 ns/iter (± 90) 0.95
es/resolver/typescript 109764339 ns/iter (± 2540558) 125503207 ns/iter (± 3501918) 0.87
es/fixer/typescript 76385650 ns/iter (± 503962) 90878441 ns/iter (± 2676079) 0.84
es/hygiene/typescript 161169780 ns/iter (± 1126345) 191030363 ns/iter (± 2460193) 0.84
es/resolver_with_hygiene/typescript 303390702 ns/iter (± 2676898) 349503752 ns/iter (± 2007629) 0.87
es/visitor/base-perf/module_clone 79118 ns/iter (± 3471) 79928 ns/iter (± 687) 0.99
es/visitor/base-perf/fold_empty 87995 ns/iter (± 849) 89494 ns/iter (± 1264) 0.98
es/visitor/base-perf/fold_noop_impl_all 89584 ns/iter (± 1344) 89308 ns/iter (± 1374) 1.00
es/visitor/base-perf/fold_noop_impl_vec 90782 ns/iter (± 1403) 90240 ns/iter (± 1094) 1.01
es/visitor/base-perf/boxing_boxed_clone 55 ns/iter (± 0) 56 ns/iter (± 0) 0.98
es/visitor/base-perf/boxing_unboxed_clone 53 ns/iter (± 0) 53 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 102 ns/iter (± 0) 103 ns/iter (± 0) 0.99
es/visitor/base-perf/boxing_unboxed 95 ns/iter (± 0) 99 ns/iter (± 0) 0.96
es/visitor/base-perf/visit_contains_this 3437 ns/iter (± 65) 3509 ns/iter (± 88) 0.98
es/base/parallel/resolver/typescript 6352093598 ns/iter (± 456585124) 7097046157 ns/iter (± 545388083) 0.90
es/base/parallel/hygiene/typescript 1946022808 ns/iter (± 26733812) 2180118476 ns/iter (± 12676137) 0.89
misc/visitors/time-complexity/time 5 95 ns/iter (± 0) 95 ns/iter (± 0) 1
misc/visitors/time-complexity/time 10 291 ns/iter (± 1) 292 ns/iter (± 4) 1.00
misc/visitors/time-complexity/time 15 601 ns/iter (± 2) 599 ns/iter (± 16) 1.00
misc/visitors/time-complexity/time 20 1198 ns/iter (± 5) 1127 ns/iter (± 53) 1.06
misc/visitors/time-complexity/time 40 5952 ns/iter (± 53) 5969 ns/iter (± 26) 1.00
misc/visitors/time-complexity/time 60 15247 ns/iter (± 127) 15561 ns/iter (± 27) 0.98
es/full-target/es2016 248358 ns/iter (± 1879) 250746 ns/iter (± 501) 0.99
es/full-target/es2017 239163 ns/iter (± 1412) 242502 ns/iter (± 836) 0.99
es/full-target/es2018 228322 ns/iter (± 1215) 231992 ns/iter (± 355) 0.98
es2020_nullish_coalescing 90422 ns/iter (± 509) 90741 ns/iter (± 435) 1.00
es2020_optional_chaining 122895 ns/iter (± 1003) 124351 ns/iter (± 442) 0.99
es2022_class_properties 144265 ns/iter (± 824) 146822 ns/iter (± 227) 0.98
es2018_object_rest_spread 93903 ns/iter (± 181) 94731 ns/iter (± 173) 0.99
es2019_optional_catch_binding 84069 ns/iter (± 174) 83942 ns/iter (± 202) 1.00
es2017_async_to_generator 84293 ns/iter (± 396) 84468 ns/iter (± 236) 1.00
es2016_exponentiation 88524 ns/iter (± 587) 88685 ns/iter (± 246) 1.00
es2015_arrow 91712 ns/iter (± 484) 93072 ns/iter (± 534) 0.99
es2015_block_scoped_fn 89546 ns/iter (± 698) 90115 ns/iter (± 467) 0.99
es2015_block_scoping 166989 ns/iter (± 826) 169646 ns/iter (± 349) 0.98

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

Please sign in to comment.