Skip to content

Commit c017874

Browse files
authoredJul 24, 2023
fix(es/typescript): Fix handling of optional chaining (#7660)
**Related issue:** - Closes #7659.
1 parent ab17d2a commit c017874

File tree

13 files changed

+88
-12
lines changed

13 files changed

+88
-12
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"jsc": {
3+
"transform": {
4+
"decoratorVersion": "2022-03"
5+
},
6+
"parser": {
7+
"syntax": "typescript",
8+
"decorators": true,
9+
"tsx": true
10+
},
11+
"target": "es5",
12+
"loose": false,
13+
},
14+
"module": {
15+
"type": "commonjs"
16+
},
17+
"isModule": true,
18+
"minify": true
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
const a = undefined
2+
a?.b!.c
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
"use strict";var _a;var a=undefined;(_a=a)===null||_a===void 0?void 0:_a.b.c;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"jsc": {
3+
"transform": {
4+
"decoratorVersion": "2022-03"
5+
},
6+
"parser": {
7+
"syntax": "typescript",
8+
"decorators": true,
9+
"tsx": true
10+
},
11+
"target": "es5",
12+
"loose": false,
13+
},
14+
"module": {
15+
"type": "commonjs"
16+
},
17+
"isModule": true,
18+
"minify": true
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
const a = undefined
2+
a?.b.c
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
"use strict";var _a;var a=undefined;(_a=a)===null||_a===void 0?void 0:_a.b.c;

‎crates/swc/tests/tsc-references/callChain.1.normal.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -82,5 +82,5 @@ _o212, _o213;
8282
]).c;
8383
var v = (_o4 = o4) === null || _o4 === void 0 ? void 0 : _o4(incr);
8484
(_o5 = o5()) === null || _o5 === void 0 ? void 0 : _o5();
85-
((_o212 = o2) === null || _o212 === void 0 ? void 0 : _o212.b()).toString;
86-
((_o213 = o2) === null || _o213 === void 0 ? void 0 : _o213.b()).toString;
85+
(_o212 = o2) === null || _o212 === void 0 ? void 0 : _o212.b().toString;
86+
(_o213 = o2) === null || _o213 === void 0 ? void 0 : _o213.b().toString;

‎crates/swc/tests/tsc-references/callChain.2.minified.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,4 @@ null === (_o1 = o1) || void 0 === _o1 || _o1(), null === (_o11 = o1) || void 0 =
5454
2,
5555
3,
5656
4
57-
]).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;
57+
]).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;

‎crates/swc/tests/tsc-references/elementAccessChain.1.normal.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ _o22, _o23, _o24, _o25;
1313
(_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;
1414
(_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"];
1515
(_o6 = o6()) === null || _o6 === void 0 ? void 0 : _o6["x"];
16-
((_o22 = o2) === null || _o22 === void 0 ? void 0 : _o22["b"]).c;
17-
((_o23 = o2) === null || _o23 === void 0 ? void 0 : _o23["b"])["c"];
18-
((_o24 = o2) === null || _o24 === void 0 ? void 0 : _o24["b"]).c;
19-
((_o25 = o2) === null || _o25 === void 0 ? void 0 : _o25["b"])["c"];
16+
(_o22 = o2) === null || _o22 === void 0 ? void 0 : _o22["b"].c;
17+
(_o23 = o2) === null || _o23 === void 0 ? void 0 : _o23["b"]["c"];
18+
(_o24 = o2) === null || _o24 === void 0 ? void 0 : _o24["b"].c;
19+
(_o25 = o2) === null || _o25 === void 0 ? void 0 : _o25["b"]["c"];

‎crates/swc/tests/tsc-references/elementAccessChain.2.minified.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎crates/swc/tests/tsc-references/propertyAccessChain.1.normal.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ _o21, _o22;
99
(_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;
1010
(_o6 = o6()) === null || _o6 === void 0 ? void 0 : _o6.x;
1111
((_o11 = o1) === null || _o11 === void 0 ? void 0 : _o11.b) ? 1 : 0;
12-
((_o21 = o2) === null || _o21 === void 0 ? void 0 : _o21.b).c;
13-
((_o22 = o2) === null || _o22 === void 0 ? void 0 : _o22.b).c;
12+
(_o21 = o2) === null || _o21 === void 0 ? void 0 : _o21.b.c;
13+
(_o22 = o2) === null || _o22 === void 0 ? void 0 : _o22.b.c;

‎crates/swc/tests/tsc-references/propertyAccessChain.2.minified.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎crates/swc_ecma_transforms_typescript/src/strip.rs

+33-1
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,7 @@ where
448448
| Expr::TsSatisfies(TsSatisfiesExpr { expr, .. }) => {
449449
expr.visit_mut_with(self);
450450
let expr = *expr.take();
451+
451452
*n = expr;
452453
}
453454

@@ -2042,7 +2043,7 @@ where
20422043
}
20432044

20442045
fn visit_mut_expr(&mut self, n: &mut Expr) {
2045-
let mut stack = vec![n];
2046+
let mut stack = vec![&mut *n];
20462047
loop {
20472048
let mut new_stack = vec![];
20482049
for expr in stack {
@@ -2052,6 +2053,37 @@ where
20522053
}
20532054

20542055
if new_stack.is_empty() {
2056+
// https://github.com/swc-project/swc/issues/7659
2057+
// a?.b!.c
2058+
// should be identical to
2059+
// a?.b.c
2060+
// and it's optional chaining expression with optional = false
2061+
match n {
2062+
Expr::Member(me) if me.obj.is_opt_chain() => {
2063+
*n = Expr::OptChain(OptChainExpr {
2064+
span: me.span,
2065+
optional: false,
2066+
base: Box::new(OptChainBase::Member(me.take())),
2067+
});
2068+
}
2069+
2070+
Expr::Call(ce)
2071+
if ce.callee.is_expr() && ce.callee.as_expr().unwrap().is_opt_chain() =>
2072+
{
2073+
*n = Expr::OptChain(OptChainExpr {
2074+
span: ce.span,
2075+
optional: false,
2076+
base: Box::new(OptChainBase::Call(OptCall {
2077+
span: ce.span,
2078+
callee: ce.callee.take().expect_expr(),
2079+
args: ce.args.take(),
2080+
type_args: ce.type_args.take(),
2081+
})),
2082+
});
2083+
}
2084+
2085+
_ => {}
2086+
}
20552087
return;
20562088
}
20572089

1 commit comments

Comments
 (1)

github-actions[bot] commented on Jul 24, 2023

@github-actions[bot]

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.