Skip to content

Commit

Permalink
fix(es/typescript): Fix handling of optional chaining (#7660)
Browse files Browse the repository at this point in the history
**Related issue:**

 - Closes #7659.
  • Loading branch information
kdy1 authored Jul 24, 2023
1 parent ab17d2a commit c017874
Show file tree
Hide file tree
Showing 13 changed files with 88 additions and 12 deletions.
19 changes: 19 additions & 0 deletions crates/swc/tests/fixture/issues-7xxx/7659/1/input/.swcrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"jsc": {
"transform": {
"decoratorVersion": "2022-03"
},
"parser": {
"syntax": "typescript",
"decorators": true,
"tsx": true
},
"target": "es5",
"loose": false,
},
"module": {
"type": "commonjs"
},
"isModule": true,
"minify": true
}
2 changes: 2 additions & 0 deletions crates/swc/tests/fixture/issues-7xxx/7659/1/input/1.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
const a = undefined
a?.b!.c
1 change: 1 addition & 0 deletions crates/swc/tests/fixture/issues-7xxx/7659/1/output/1.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"use strict";var _a;var a=undefined;(_a=a)===null||_a===void 0?void 0:_a.b.c;
19 changes: 19 additions & 0 deletions crates/swc/tests/fixture/issues-7xxx/7659/2/input/.swcrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"jsc": {
"transform": {
"decoratorVersion": "2022-03"
},
"parser": {
"syntax": "typescript",
"decorators": true,
"tsx": true
},
"target": "es5",
"loose": false,
},
"module": {
"type": "commonjs"
},
"isModule": true,
"minify": true
}
2 changes: 2 additions & 0 deletions crates/swc/tests/fixture/issues-7xxx/7659/2/input/1.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
const a = undefined
a?.b.c
1 change: 1 addition & 0 deletions crates/swc/tests/fixture/issues-7xxx/7659/2/output/1.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"use strict";var _a;var a=undefined;(_a=a)===null||_a===void 0?void 0:_a.b.c;
4 changes: 2 additions & 2 deletions crates/swc/tests/tsc-references/callChain.1.normal.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,5 +82,5 @@ _o212, _o213;
]).c;
var v = (_o4 = o4) === null || _o4 === void 0 ? void 0 : _o4(incr);
(_o5 = o5()) === null || _o5 === void 0 ? void 0 : _o5();
((_o212 = o2) === null || _o212 === void 0 ? void 0 : _o212.b()).toString;
((_o213 = o2) === null || _o213 === void 0 ? void 0 : _o213.b()).toString;
(_o212 = o2) === null || _o212 === void 0 ? void 0 : _o212.b().toString;
(_o213 = o2) === null || _o213 === void 0 ? void 0 : _o213.b().toString;
2 changes: 1 addition & 1 deletion crates/swc/tests/tsc-references/callChain.2.minified.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,4 @@ null === (_o1 = o1) || void 0 === _o1 || _o1(), null === (_o11 = o1) || void 0 =
2,
3,
4
]).c, null === (_o4 = o4) || void 0 === _o4 || _o4(incr), null === (_o5 = o5()) || void 0 === _o5 || _o5(), (null === (_o212 = o2) || void 0 === _o212 ? void 0 : _o212.b()).toString, (null === (_o213 = o2) || void 0 === _o213 ? void 0 : _o213.b()).toString;
]).c, null === (_o4 = o4) || void 0 === _o4 || _o4(incr), null === (_o5 = o5()) || void 0 === _o5 || _o5(), null === (_o212 = o2) || void 0 === _o212 || _o212.b().toString, null === (_o213 = o2) || void 0 === _o213 || _o213.b().toString;
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ _o22, _o23, _o24, _o25;
(_o5_b2 = (_o52 = o5)["b"]) === null || _o5_b2 === void 0 ? void 0 : (_o5_b_c_d2 = _o5_b2.call(_o52)["c"].d) === null || _o5_b_c_d2 === void 0 ? void 0 : _o5_b_c_d2.e;
(_o5_b3 = (_o53 = o5)["b"]) === null || _o5_b3 === void 0 ? void 0 : (_o5_b_c_d3 = _o5_b3.call(_o53)["c"].d) === null || _o5_b_c_d3 === void 0 ? void 0 : _o5_b_c_d3["e"];
(_o6 = o6()) === null || _o6 === void 0 ? void 0 : _o6["x"];
((_o22 = o2) === null || _o22 === void 0 ? void 0 : _o22["b"]).c;
((_o23 = o2) === null || _o23 === void 0 ? void 0 : _o23["b"])["c"];
((_o24 = o2) === null || _o24 === void 0 ? void 0 : _o24["b"]).c;
((_o25 = o2) === null || _o25 === void 0 ? void 0 : _o25["b"])["c"];
(_o22 = o2) === null || _o22 === void 0 ? void 0 : _o22["b"].c;
(_o23 = o2) === null || _o23 === void 0 ? void 0 : _o23["b"]["c"];
(_o24 = o2) === null || _o24 === void 0 ? void 0 : _o24["b"].c;
(_o25 = o2) === null || _o25 === void 0 ? void 0 : _o25["b"]["c"];

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ _o21, _o22;
(_o5_b = (_o5 = o5).b) === null || _o5_b === void 0 ? void 0 : (_o5_b_c_d = _o5_b.call(_o5).c.d) === null || _o5_b_c_d === void 0 ? void 0 : _o5_b_c_d.e;
(_o6 = o6()) === null || _o6 === void 0 ? void 0 : _o6.x;
((_o11 = o1) === null || _o11 === void 0 ? void 0 : _o11.b) ? 1 : 0;
((_o21 = o2) === null || _o21 === void 0 ? void 0 : _o21.b).c;
((_o22 = o2) === null || _o22 === void 0 ? void 0 : _o22.b).c;
(_o21 = o2) === null || _o21 === void 0 ? void 0 : _o21.b.c;
(_o22 = o2) === null || _o22 === void 0 ? void 0 : _o22.b.c;

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

34 changes: 33 additions & 1 deletion crates/swc_ecma_transforms_typescript/src/strip.rs
Original file line number Diff line number Diff line change
Expand Up @@ -448,6 +448,7 @@ where
| Expr::TsSatisfies(TsSatisfiesExpr { expr, .. }) => {
expr.visit_mut_with(self);
let expr = *expr.take();

*n = expr;
}

Expand Down Expand Up @@ -2042,7 +2043,7 @@ where
}

fn visit_mut_expr(&mut self, n: &mut Expr) {
let mut stack = vec![n];
let mut stack = vec![&mut *n];
loop {
let mut new_stack = vec![];
for expr in stack {
Expand All @@ -2052,6 +2053,37 @@ where
}

if new_stack.is_empty() {
// https://github.com/swc-project/swc/issues/7659
// a?.b!.c
// should be identical to
// a?.b.c
// and it's optional chaining expression with optional = false
match n {
Expr::Member(me) if me.obj.is_opt_chain() => {
*n = Expr::OptChain(OptChainExpr {
span: me.span,
optional: false,
base: Box::new(OptChainBase::Member(me.take())),
});
}

Expr::Call(ce)
if ce.callee.is_expr() && ce.callee.as_expr().unwrap().is_opt_chain() =>
{
*n = Expr::OptChain(OptChainExpr {
span: ce.span,
optional: false,
base: Box::new(OptChainBase::Call(OptCall {
span: ce.span,
callee: ce.callee.take().expect_expr(),
args: ce.args.take(),
type_args: ce.type_args.take(),
})),
});
}

_ => {}
}
return;
}

Expand Down

1 comment on commit c017874

@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: c017874 Previous: 951138c Ratio
es/full/bugs-1 299354 ns/iter (± 8864) 283739 ns/iter (± 4895) 1.06
es/full/minify/libraries/antd 1340500472 ns/iter (± 14753046) 1357910406 ns/iter (± 18392269) 0.99
es/full/minify/libraries/d3 279874315 ns/iter (± 1575578) 292043673 ns/iter (± 4774406) 0.96
es/full/minify/libraries/echarts 1080702230 ns/iter (± 13391196) 1121112761 ns/iter (± 7444746) 0.96
es/full/minify/libraries/jquery 86168707 ns/iter (± 191861) 86866527 ns/iter (± 712723) 0.99
es/full/minify/libraries/lodash 100045110 ns/iter (± 297306) 100504811 ns/iter (± 391356) 1.00
es/full/minify/libraries/moment 50666408 ns/iter (± 155381) 50953221 ns/iter (± 113485) 0.99
es/full/minify/libraries/react 18245543 ns/iter (± 33672) 18236844 ns/iter (± 82815) 1.00
es/full/minify/libraries/terser 223003353 ns/iter (± 1608783) 225182701 ns/iter (± 929107) 0.99
es/full/minify/libraries/three 393415605 ns/iter (± 2994985) 404492091 ns/iter (± 3533121) 0.97
es/full/minify/libraries/typescript 2713908929 ns/iter (± 11935916) 2729126946 ns/iter (± 29429371) 0.99
es/full/minify/libraries/victory 584117016 ns/iter (± 7943298) 575161292 ns/iter (± 12203907) 1.02
es/full/minify/libraries/vue 122765103 ns/iter (± 338230) 123010385 ns/iter (± 1485444) 1.00
es/full/codegen/es3 34223 ns/iter (± 193) 34134 ns/iter (± 68) 1.00
es/full/codegen/es5 34282 ns/iter (± 58) 34065 ns/iter (± 85) 1.01
es/full/codegen/es2015 34242 ns/iter (± 91) 34142 ns/iter (± 66) 1.00
es/full/codegen/es2016 34257 ns/iter (± 83) 34126 ns/iter (± 87) 1.00
es/full/codegen/es2017 34280 ns/iter (± 98) 34035 ns/iter (± 92) 1.01
es/full/codegen/es2018 34333 ns/iter (± 127) 34107 ns/iter (± 81) 1.01
es/full/codegen/es2019 34300 ns/iter (± 72) 34140 ns/iter (± 72) 1.00
es/full/codegen/es2020 34184 ns/iter (± 66) 34139 ns/iter (± 74) 1.00
es/full/all/es3 172510590 ns/iter (± 792483) 172718337 ns/iter (± 1104100) 1.00
es/full/all/es5 165852664 ns/iter (± 853104) 164355674 ns/iter (± 1001487) 1.01
es/full/all/es2015 124716335 ns/iter (± 988525) 123942817 ns/iter (± 523550) 1.01
es/full/all/es2016 123968465 ns/iter (± 564044) 123592732 ns/iter (± 1067611) 1.00
es/full/all/es2017 123157239 ns/iter (± 743120) 122076147 ns/iter (± 538422) 1.01
es/full/all/es2018 120969250 ns/iter (± 488711) 120362192 ns/iter (± 576364) 1.01
es/full/all/es2019 120460734 ns/iter (± 624970) 119802659 ns/iter (± 859275) 1.01
es/full/all/es2020 115547454 ns/iter (± 894972) 115016042 ns/iter (± 917681) 1.00
es/full/parser 535690 ns/iter (± 6190) 534799 ns/iter (± 6467) 1.00
es/full/base/fixer 19715 ns/iter (± 96) 17683 ns/iter (± 67) 1.11
es/full/base/resolver_and_hygiene 85000 ns/iter (± 273) 83181 ns/iter (± 163) 1.02
serialization of serde 286 ns/iter (± 7) 291 ns/iter (± 0) 0.98
css/minify/libraries/bootstrap 29157054 ns/iter (± 106238) 28798243 ns/iter (± 96346) 1.01
css/visitor/compare/clone 1636983 ns/iter (± 5355) 1642135 ns/iter (± 4768) 1.00
css/visitor/compare/visit_mut_span 1781575 ns/iter (± 7213) 1790081 ns/iter (± 5769) 1.00
css/visitor/compare/visit_mut_span_panic 1833143 ns/iter (± 5140) 1842535 ns/iter (± 2924) 0.99
css/visitor/compare/fold_span 2569653 ns/iter (± 16738) 2560112 ns/iter (± 16375) 1.00
css/visitor/compare/fold_span_panic 2763491 ns/iter (± 11143) 2751312 ns/iter (± 13853) 1.00
css/lexer/bootstrap_5_1_3 4402378 ns/iter (± 2127) 4433388 ns/iter (± 3448) 0.99
css/lexer/foundation_6_7_4 3714542 ns/iter (± 192260) 3756957 ns/iter (± 1845) 0.99
css/lexer/tailwind_3_1_1 707786 ns/iter (± 175) 712790 ns/iter (± 564) 0.99
css/parser/bootstrap_5_1_3 19535800 ns/iter (± 44828) 20172369 ns/iter (± 36499) 0.97
css/parser/foundation_6_7_4 15663227 ns/iter (± 29369) 16099106 ns/iter (± 45805) 0.97
css/parser/tailwind_3_1_1 2972211 ns/iter (± 3689) 3099826 ns/iter (± 3293) 0.96
es/codegen/colors 736419 ns/iter (± 402183) 756306 ns/iter (± 401849) 0.97
es/codegen/large 3154153 ns/iter (± 1682046) 3158740 ns/iter (± 1665466) 1.00
es/codegen/with-parser/colors 44299 ns/iter (± 426) 44142 ns/iter (± 453) 1.00
es/codegen/with-parser/large 480815 ns/iter (± 1058) 482393 ns/iter (± 1348) 1.00
es/minify/libraries/antd 1146689176 ns/iter (± 12168444) 1167070035 ns/iter (± 16082500) 0.98
es/minify/libraries/d3 242582915 ns/iter (± 1206232) 243091491 ns/iter (± 1281574) 1.00
es/minify/libraries/echarts 917331587 ns/iter (± 12062972) 930953945 ns/iter (± 5098739) 0.99
es/minify/libraries/jquery 73889159 ns/iter (± 77216) 74254758 ns/iter (± 246414) 1.00
es/minify/libraries/lodash 88873556 ns/iter (± 151280) 88551790 ns/iter (± 199190) 1.00
es/minify/libraries/moment 43662597 ns/iter (± 161031) 43622796 ns/iter (± 109356) 1.00
es/minify/libraries/react 16082564 ns/iter (± 52655) 16096109 ns/iter (± 60241) 1.00
es/minify/libraries/terser 188362861 ns/iter (± 1178158) 189759093 ns/iter (± 860920) 0.99
es/minify/libraries/three 324185243 ns/iter (± 3160259) 325563318 ns/iter (± 1661307) 1.00
es/minify/libraries/typescript 2293171199 ns/iter (± 13713575) 2294015210 ns/iter (± 12318055) 1.00
es/minify/libraries/victory 480955467 ns/iter (± 5449206) 487923416 ns/iter (± 3514998) 0.99
es/minify/libraries/vue 107575027 ns/iter (± 298342) 108414179 ns/iter (± 790473) 0.99
es/visitor/compare/clone 1950679 ns/iter (± 4021) 1934960 ns/iter (± 18816) 1.01
es/visitor/compare/visit_mut_span 2289365 ns/iter (± 5244) 2282528 ns/iter (± 2591) 1.00
es/visitor/compare/visit_mut_span_panic 2331102 ns/iter (± 7191) 2312759 ns/iter (± 5079) 1.01
es/visitor/compare/fold_span 3343799 ns/iter (± 3981) 3316503 ns/iter (± 2933) 1.01
es/visitor/compare/fold_span_panic 3503301 ns/iter (± 7018) 3483401 ns/iter (± 2475) 1.01
es/lexer/colors 12662 ns/iter (± 28) 13022 ns/iter (± 19) 0.97
es/lexer/angular 6223088 ns/iter (± 3507) 6144771 ns/iter (± 8075) 1.01
es/lexer/backbone 821304 ns/iter (± 1233) 811470 ns/iter (± 1060) 1.01
es/lexer/jquery 4613338 ns/iter (± 8201) 4529183 ns/iter (± 3588) 1.02
es/lexer/jquery mobile 7050057 ns/iter (± 5225) 6960376 ns/iter (± 2527) 1.01
es/lexer/mootools 3643434 ns/iter (± 1613) 3598939 ns/iter (± 1101) 1.01
es/lexer/underscore 689642 ns/iter (± 1083) 679775 ns/iter (± 1006) 1.01
es/lexer/three 21676791 ns/iter (± 26979) 21413757 ns/iter (± 18323) 1.01
es/lexer/yui 3959681 ns/iter (± 1861) 3913429 ns/iter (± 4390) 1.01
es/parser/colors 26765 ns/iter (± 78) 26280 ns/iter (± 47) 1.02
es/parser/angular 13501416 ns/iter (± 77117) 13342753 ns/iter (± 69789) 1.01
es/parser/backbone 2022250 ns/iter (± 8866) 1973709 ns/iter (± 8923) 1.02
es/parser/jquery 10954795 ns/iter (± 39578) 10753090 ns/iter (± 39636) 1.02
es/parser/jquery mobile 16750488 ns/iter (± 47891) 16566526 ns/iter (± 195241) 1.01
es/parser/mootools 8465783 ns/iter (± 19422) 8242130 ns/iter (± 17883) 1.03
es/parser/underscore 1740431 ns/iter (± 9773) 1701820 ns/iter (± 8810) 1.02
es/parser/three 46822452 ns/iter (± 326125) 47188213 ns/iter (± 861637) 0.99
es/parser/yui 8299440 ns/iter (± 29560) 8166263 ns/iter (± 47604) 1.02
es/preset-env/usage/builtin_type 135998 ns/iter (± 31970) 135971 ns/iter (± 30944) 1.00
es/preset-env/usage/property 17072 ns/iter (± 47) 17107 ns/iter (± 62) 1.00
es/resolver/typescript 88853439 ns/iter (± 722757) 90198237 ns/iter (± 1243091) 0.99
es/fixer/typescript 64791984 ns/iter (± 889126) 64057495 ns/iter (± 820316) 1.01
es/hygiene/typescript 133022945 ns/iter (± 1326560) 136281481 ns/iter (± 3627283) 0.98
es/resolver_with_hygiene/typescript 245633552 ns/iter (± 1194929) 250985943 ns/iter (± 3296262) 0.98
es/visitor/base-perf/module_clone 59742 ns/iter (± 221) 61664 ns/iter (± 235) 0.97
es/visitor/base-perf/fold_empty 64167 ns/iter (± 184) 64668 ns/iter (± 343) 0.99
es/visitor/base-perf/fold_noop_impl_all 63356 ns/iter (± 285) 64759 ns/iter (± 553) 0.98
es/visitor/base-perf/fold_noop_impl_vec 64215 ns/iter (± 207) 64900 ns/iter (± 284) 0.99
es/visitor/base-perf/boxing_boxed_clone 56 ns/iter (± 0) 59 ns/iter (± 0) 0.95
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) 108 ns/iter (± 0) 1.01
es/visitor/base-perf/boxing_unboxed 78 ns/iter (± 0) 78 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 2528 ns/iter (± 18) 2520 ns/iter (± 19) 1.00
es/base/parallel/resolver/typescript 4032674429 ns/iter (± 336096527) 4481123869 ns/iter (± 271760016) 0.90
es/base/parallel/hygiene/typescript 1451902790 ns/iter (± 15524198) 1476104863 ns/iter (± 14112456) 0.98
misc/visitors/time-complexity/time 5 134 ns/iter (± 2) 137 ns/iter (± 1) 0.98
misc/visitors/time-complexity/time 10 374 ns/iter (± 1) 285 ns/iter (± 47) 1.31
misc/visitors/time-complexity/time 15 731 ns/iter (± 3) 683 ns/iter (± 5) 1.07
misc/visitors/time-complexity/time 20 937 ns/iter (± 74) 1062 ns/iter (± 3) 0.88
misc/visitors/time-complexity/time 40 3558 ns/iter (± 16) 3704 ns/iter (± 291) 0.96
misc/visitors/time-complexity/time 60 8801 ns/iter (± 4) 8131 ns/iter (± 731) 1.08
es/full-target/es2016 241488 ns/iter (± 707) 238298 ns/iter (± 1668) 1.01
es/full-target/es2017 229765 ns/iter (± 603) 224099 ns/iter (± 523) 1.03
es/full-target/es2018 216762 ns/iter (± 798) 213795 ns/iter (± 715) 1.01
es2020_nullish_coalescing 71452 ns/iter (± 1879) 69076 ns/iter (± 319) 1.03
es2020_optional_chaining 82116 ns/iter (± 433) 78288 ns/iter (± 315) 1.05
es2022_class_properties 120759 ns/iter (± 414) 118576 ns/iter (± 221) 1.02
es2018_object_rest_spread 75200 ns/iter (± 373) 75022 ns/iter (± 232) 1.00
es2019_optional_catch_binding 64708 ns/iter (± 177) 64921 ns/iter (± 186) 1.00
es2017_async_to_generator 65308 ns/iter (± 232) 63471 ns/iter (± 124) 1.03
es2016_exponentiation 69013 ns/iter (± 176) 68359 ns/iter (± 293) 1.01
es2015_arrow 71951 ns/iter (± 204) 73343 ns/iter (± 355) 0.98
es2015_block_scoped_fn 70131 ns/iter (± 305) 68563 ns/iter (± 200) 1.02
es2015_block_scoping 124759 ns/iter (± 477) 125273 ns/iter (± 595) 1.00

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

Please sign in to comment.