Skip to content

Commit

Permalink
fix(es/compat): Fix handling of private members in optional chaining …
Browse files Browse the repository at this point in the history
…pass (#7610)

**Related issue:**

 - Closes #7561.
  • Loading branch information
komyg committed Jul 28, 2023
1 parent e105f20 commit 7ba7b6e
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 2 deletions.
49 changes: 47 additions & 2 deletions crates/swc_ecma_transforms_compat/src/es2020/optional_chaining.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use std::mem;

use serde::Deserialize;
use swc_atoms::js_word;
use swc_common::{util::take::Take, DUMMY_SP};
use swc_ecma_ast::*;
use swc_ecma_utils::{
Expand Down Expand Up @@ -181,7 +182,13 @@ impl OptChaining {
next = m.obj.take();
m.prop.visit_mut_with(self);
chain.push(if optional {
Gathering::OptMember(m.take(), self.memoize(&next))
match *next {
Expr::This(_) => Gathering::OptMember(
m.take(),
Ident::new(js_word!("this"), DUMMY_SP),
),
_ => Gathering::OptMember(m.take(), self.memoize(&next)),
}
} else {
Gathering::Member(m.take())
});
Expand Down Expand Up @@ -299,7 +306,11 @@ impl OptChaining {
Gathering::OptMember(mut m, memo) => {
committed_cond.push(CondExpr {
span: DUMMY_SP,
test: init_and_eq_null_or_undefined(&memo, current, no_document_all),
test: if memo.sym == js_word!("this") {
eq_null_or_undefined(&memo, no_document_all)
} else {
init_and_eq_null_or_undefined(&memo, current, no_document_all)
},
cons: if is_delete {
true.into()
} else {
Expand Down Expand Up @@ -409,3 +420,37 @@ fn init_and_eq_null_or_undefined(i: &Ident, init: Expr, no_document_all: bool) -
right: void_cmp,
}))
}

fn eq_null_or_undefined(i: &Ident, no_document_all: bool) -> Box<Expr> {
let lhs = Box::new(Expr::Ident(i.clone()));

if no_document_all {
return Box::new(Expr::Bin(BinExpr {
span: DUMMY_SP,
left: lhs,
op: op!("=="),
right: Box::new(Expr::Lit(Lit::Null(Null { span: DUMMY_SP }))),
}));
}

let null_cmp = Box::new(Expr::Bin(BinExpr {
span: DUMMY_SP,
left: lhs,
op: op!("==="),
right: Box::new(Expr::Lit(Lit::Null(Null { span: DUMMY_SP }))),
}));

let void_cmp = Box::new(Expr::Bin(BinExpr {
span: DUMMY_SP,
left: Box::new(Expr::Ident(i.clone())),
op: op!("==="),
right: undefined(DUMMY_SP),
}));

Box::new(Expr::Bin(BinExpr {
span: DUMMY_SP,
left: null_cmp,
op: op!("||"),
right: void_cmp,
}))
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
class Foo {
#x;

test() {
this?.y.#x;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
class Foo {
#x;
test() {
this === null || this === void 0 ? void 0 : this.y.#x;
}
}

1 comment on commit 7ba7b6e

@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: 7ba7b6e Previous: 2bc9637 Ratio
es/full/bugs-1 292613 ns/iter (± 9598) 288126 ns/iter (± 7369) 1.02
es/full/minify/libraries/antd 1300970785 ns/iter (± 10885766) 1331311908 ns/iter (± 25989677) 0.98
es/full/minify/libraries/d3 278938859 ns/iter (± 3232583) 281959320 ns/iter (± 5183671) 0.99
es/full/minify/libraries/echarts 1062319957 ns/iter (± 5585420) 1090060535 ns/iter (± 9008808) 0.97
es/full/minify/libraries/jquery 84274554 ns/iter (± 166924) 85045341 ns/iter (± 200947) 0.99
es/full/minify/libraries/lodash 98100362 ns/iter (± 349352) 98396843 ns/iter (± 680771) 1.00
es/full/minify/libraries/moment 49631568 ns/iter (± 199292) 49510157 ns/iter (± 233972) 1.00
es/full/minify/libraries/react 17918933 ns/iter (± 33046) 17963478 ns/iter (± 99869) 1.00
es/full/minify/libraries/terser 220362223 ns/iter (± 924512) 219291746 ns/iter (± 1141463) 1.00
es/full/minify/libraries/three 383423154 ns/iter (± 1423791) 392335249 ns/iter (± 4392139) 0.98
es/full/minify/libraries/typescript 2657663795 ns/iter (± 8921129) 2678456645 ns/iter (± 23849411) 0.99
es/full/minify/libraries/victory 568475799 ns/iter (± 3692065) 556786690 ns/iter (± 4144755) 1.02
es/full/minify/libraries/vue 120116784 ns/iter (± 247052) 120116640 ns/iter (± 474001) 1.00
es/full/codegen/es3 34428 ns/iter (± 80) 35114 ns/iter (± 81) 0.98
es/full/codegen/es5 34489 ns/iter (± 135) 34975 ns/iter (± 62) 0.99
es/full/codegen/es2015 34454 ns/iter (± 82) 34932 ns/iter (± 107) 0.99
es/full/codegen/es2016 34452 ns/iter (± 87) 35006 ns/iter (± 85) 0.98
es/full/codegen/es2017 34464 ns/iter (± 77) 34842 ns/iter (± 92) 0.99
es/full/codegen/es2018 34480 ns/iter (± 84) 34925 ns/iter (± 122) 0.99
es/full/codegen/es2019 34509 ns/iter (± 99) 34945 ns/iter (± 77) 0.99
es/full/codegen/es2020 34524 ns/iter (± 79) 34866 ns/iter (± 97) 0.99
es/full/all/es3 174104513 ns/iter (± 835650) 173987823 ns/iter (± 711433) 1.00
es/full/all/es5 164630441 ns/iter (± 1609662) 166206174 ns/iter (± 729470) 0.99
es/full/all/es2015 124699369 ns/iter (± 904112) 123800359 ns/iter (± 563337) 1.01
es/full/all/es2016 123155353 ns/iter (± 381471) 123666557 ns/iter (± 1142741) 1.00
es/full/all/es2017 122801784 ns/iter (± 1719036) 122822377 ns/iter (± 961373) 1.00
es/full/all/es2018 120767613 ns/iter (± 561454) 120275809 ns/iter (± 618639) 1.00
es/full/all/es2019 120283544 ns/iter (± 786964) 120234905 ns/iter (± 2247746) 1.00
es/full/all/es2020 115831872 ns/iter (± 407535) 115415297 ns/iter (± 697124) 1.00
es/full/parser 529611 ns/iter (± 5239) 525666 ns/iter (± 6178) 1.01
es/full/base/fixer 17998 ns/iter (± 249) 19716 ns/iter (± 133) 0.91
es/full/base/resolver_and_hygiene 83186 ns/iter (± 118) 84972 ns/iter (± 167) 0.98
serialization of serde 298 ns/iter (± 0) 297 ns/iter (± 2) 1.00
css/minify/libraries/bootstrap 28909367 ns/iter (± 53277) 29381964 ns/iter (± 83086) 0.98
css/visitor/compare/clone 1632123 ns/iter (± 8182) 1635052 ns/iter (± 7194) 1.00
css/visitor/compare/visit_mut_span 1770668 ns/iter (± 4589) 1763429 ns/iter (± 4810) 1.00
css/visitor/compare/visit_mut_span_panic 1831081 ns/iter (± 4005) 1840397 ns/iter (± 5012) 0.99
css/visitor/compare/fold_span 2561220 ns/iter (± 14094) 2559334 ns/iter (± 12968) 1.00
css/visitor/compare/fold_span_panic 2763839 ns/iter (± 17572) 2755912 ns/iter (± 20586) 1.00
css/lexer/bootstrap_5_1_3 4462435 ns/iter (± 3064) 4447586 ns/iter (± 7480) 1.00
css/lexer/foundation_6_7_4 3754639 ns/iter (± 3275) 3752394 ns/iter (± 3320) 1.00
css/lexer/tailwind_3_1_1 715398 ns/iter (± 1303) 712017 ns/iter (± 837) 1.00
css/parser/bootstrap_5_1_3 20104286 ns/iter (± 89068) 20193719 ns/iter (± 132837) 1.00
css/parser/foundation_6_7_4 16081542 ns/iter (± 45943) 16148443 ns/iter (± 22982) 1.00
css/parser/tailwind_3_1_1 3107646 ns/iter (± 4425) 3056699 ns/iter (± 7074) 1.02
es/codegen/colors 734643 ns/iter (± 401977) 735568 ns/iter (± 402114) 1.00
es/codegen/large 3134420 ns/iter (± 1682394) 3142620 ns/iter (± 1678067) 1.00
es/codegen/with-parser/colors 45036 ns/iter (± 465) 43649 ns/iter (± 471) 1.03
es/codegen/with-parser/large 483091 ns/iter (± 726) 480876 ns/iter (± 719) 1.00
es/minify/libraries/antd 1138085686 ns/iter (± 16542090) 1121835170 ns/iter (± 9327105) 1.01
es/minify/libraries/d3 241913269 ns/iter (± 3309026) 239345307 ns/iter (± 2247513) 1.01
es/minify/libraries/echarts 907587296 ns/iter (± 5670936) 895782126 ns/iter (± 3944785) 1.01
es/minify/libraries/jquery 74357527 ns/iter (± 149135) 73404735 ns/iter (± 133346) 1.01
es/minify/libraries/lodash 88941073 ns/iter (± 172555) 88261895 ns/iter (± 831666) 1.01
es/minify/libraries/moment 43817384 ns/iter (± 57538) 43474106 ns/iter (± 91032) 1.01
es/minify/libraries/react 16176232 ns/iter (± 29087) 16040529 ns/iter (± 91813) 1.01
es/minify/libraries/terser 188149099 ns/iter (± 321922) 185874162 ns/iter (± 758847) 1.01
es/minify/libraries/three 323129330 ns/iter (± 671538) 319249540 ns/iter (± 1653147) 1.01
es/minify/libraries/typescript 2282172089 ns/iter (± 8093874) 2254891319 ns/iter (± 20285605) 1.01
es/minify/libraries/victory 472456794 ns/iter (± 2202431) 465245455 ns/iter (± 1801333) 1.02
es/minify/libraries/vue 108088286 ns/iter (± 291029) 106632562 ns/iter (± 137025) 1.01
es/visitor/compare/clone 1928984 ns/iter (± 3274) 1961030 ns/iter (± 4404) 0.98
es/visitor/compare/visit_mut_span 2270956 ns/iter (± 7797) 2311761 ns/iter (± 5444) 0.98
es/visitor/compare/visit_mut_span_panic 2317299 ns/iter (± 3812) 2346410 ns/iter (± 5202) 0.99
es/visitor/compare/fold_span 3313534 ns/iter (± 4216) 3363434 ns/iter (± 6442) 0.99
es/visitor/compare/fold_span_panic 3477057 ns/iter (± 3457) 3491073 ns/iter (± 28720) 1.00
es/lexer/colors 12546 ns/iter (± 13) 12634 ns/iter (± 39) 0.99
es/lexer/angular 6180161 ns/iter (± 7938) 6174529 ns/iter (± 5275) 1.00
es/lexer/backbone 800903 ns/iter (± 7709) 808771 ns/iter (± 2506) 0.99
es/lexer/jquery 4489655 ns/iter (± 5784) 4513445 ns/iter (± 1119) 0.99
es/lexer/jquery mobile 6946337 ns/iter (± 30668) 6942246 ns/iter (± 3863) 1.00
es/lexer/mootools 3569666 ns/iter (± 12949) 3593660 ns/iter (± 8363) 0.99
es/lexer/underscore 674907 ns/iter (± 1014) 673202 ns/iter (± 951) 1.00
es/lexer/three 21248544 ns/iter (± 44746) 21236998 ns/iter (± 27080) 1.00
es/lexer/yui 3850698 ns/iter (± 5118) 3902840 ns/iter (± 2964) 0.99
es/parser/colors 26273 ns/iter (± 53) 26487 ns/iter (± 92) 0.99
es/parser/angular 13411388 ns/iter (± 40783) 13223671 ns/iter (± 69924) 1.01
es/parser/backbone 1994840 ns/iter (± 18508) 1966022 ns/iter (± 9783) 1.01
es/parser/jquery 10742773 ns/iter (± 34447) 10658625 ns/iter (± 55502) 1.01
es/parser/jquery mobile 16567063 ns/iter (± 35543) 16295363 ns/iter (± 51250) 1.02
es/parser/mootools 8294620 ns/iter (± 16078) 8217752 ns/iter (± 17334) 1.01
es/parser/underscore 1708116 ns/iter (± 9213) 1692274 ns/iter (± 10071) 1.01
es/parser/three 45986206 ns/iter (± 175509) 46075807 ns/iter (± 417081) 1.00
es/parser/yui 8203693 ns/iter (± 30971) 8105646 ns/iter (± 25869) 1.01
es/preset-env/usage/builtin_type 134705 ns/iter (± 32207) 133955 ns/iter (± 30893) 1.01
es/preset-env/usage/property 16316 ns/iter (± 47) 16629 ns/iter (± 119) 0.98
es/resolver/typescript 88854912 ns/iter (± 1223927) 88141443 ns/iter (± 1578360) 1.01
es/fixer/typescript 63851246 ns/iter (± 269961) 63497731 ns/iter (± 790017) 1.01
es/hygiene/typescript 132918356 ns/iter (± 743705) 130692640 ns/iter (± 525776) 1.02
es/resolver_with_hygiene/typescript 243198368 ns/iter (± 761162) 241417072 ns/iter (± 1209933) 1.01
es/visitor/base-perf/module_clone 60913 ns/iter (± 420) 60891 ns/iter (± 216) 1.00
es/visitor/base-perf/fold_empty 64057 ns/iter (± 608) 66153 ns/iter (± 171) 0.97
es/visitor/base-perf/fold_noop_impl_all 64264 ns/iter (± 636) 66625 ns/iter (± 470) 0.96
es/visitor/base-perf/fold_noop_impl_vec 65396 ns/iter (± 573) 67257 ns/iter (± 2045) 0.97
es/visitor/base-perf/boxing_boxed_clone 57 ns/iter (± 0) 57 ns/iter (± 0) 1
es/visitor/base-perf/boxing_unboxed_clone 40 ns/iter (± 0) 39 ns/iter (± 0) 1.03
es/visitor/base-perf/boxing_boxed 109 ns/iter (± 0) 116 ns/iter (± 0) 0.94
es/visitor/base-perf/boxing_unboxed 77 ns/iter (± 0) 77 ns/iter (± 0) 1
es/visitor/base-perf/visit_empty 0 ns/iter (± 0) 0 ns/iter (± 0) NaN
es/visitor/base-perf/visit_contains_this 2539 ns/iter (± 12) 2511 ns/iter (± 9) 1.01
es/base/parallel/resolver/typescript 4384674556 ns/iter (± 295005176) 4467485394 ns/iter (± 262302335) 0.98
es/base/parallel/hygiene/typescript 1474789056 ns/iter (± 20767135) 1454762581 ns/iter (± 16822850) 1.01
misc/visitors/time-complexity/time 5 136 ns/iter (± 1) 136 ns/iter (± 6) 1
misc/visitors/time-complexity/time 10 385 ns/iter (± 2) 380 ns/iter (± 3) 1.01
misc/visitors/time-complexity/time 15 676 ns/iter (± 4) 525 ns/iter (± 2) 1.29
misc/visitors/time-complexity/time 20 1061 ns/iter (± 6) 1061 ns/iter (± 15) 1
misc/visitors/time-complexity/time 40 3578 ns/iter (± 27) 3543 ns/iter (± 6) 1.01
misc/visitors/time-complexity/time 60 7337 ns/iter (± 24) 7467 ns/iter (± 53) 0.98
es/full-target/es2016 235681 ns/iter (± 1163) 238296 ns/iter (± 1344) 0.99
es/full-target/es2017 224478 ns/iter (± 533) 225322 ns/iter (± 991) 1.00
es/full-target/es2018 212600 ns/iter (± 787) 212996 ns/iter (± 1350) 1.00
es2020_nullish_coalescing 68723 ns/iter (± 440) 71613 ns/iter (± 384) 0.96
es2020_optional_chaining 79314 ns/iter (± 257) 81616 ns/iter (± 315) 0.97
es2022_class_properties 118367 ns/iter (± 303) 118237 ns/iter (± 337) 1.00
es2018_object_rest_spread 73189 ns/iter (± 308) 75493 ns/iter (± 2184) 0.97
es2019_optional_catch_binding 61952 ns/iter (± 209) 65242 ns/iter (± 217) 0.95
es2017_async_to_generator 61887 ns/iter (± 226) 64321 ns/iter (± 422) 0.96
es2016_exponentiation 67051 ns/iter (± 221) 68993 ns/iter (± 213) 0.97
es2015_arrow 70026 ns/iter (± 196) 72003 ns/iter (± 225) 0.97
es2015_block_scoped_fn 66764 ns/iter (± 267) 68669 ns/iter (± 117) 0.97
es2015_block_scoping 122251 ns/iter (± 721) 120221 ns/iter (± 1381) 1.02

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

Please sign in to comment.