Skip to content

Commit

Permalink
fix(es/parser): Parse const type parameters in arrow function expre…
Browse files Browse the repository at this point in the history
…ssions (#7242)
  • Loading branch information
dsherret committed Apr 11, 2023
1 parent 2a66235 commit 6614886
Show file tree
Hide file tree
Showing 7 changed files with 400 additions and 14 deletions.
2 changes: 1 addition & 1 deletion crates/swc_ecma_parser/src/parser/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ impl<I: Tokens> Parser<I> {
}
}

let type_parameters = p.parse_ts_type_params(false, false)?;
let type_parameters = p.parse_ts_type_params(false, true)?;
let mut arrow = p.parse_assignment_expr_base()?;
match *arrow {
Expr::Arrow(ArrowExpr {
Expand Down
9 changes: 3 additions & 6 deletions crates/swc_ecma_parser/src/parser/typescript.rs
Original file line number Diff line number Diff line change
Expand Up @@ -398,16 +398,16 @@ impl<I: Tokens> Parser<I> {
)? {
match modifer {
"const" => {
is_const = true;
if !permit_const {
self.emit_err(
self.input.prev_span(),
SyntaxError::TS1277(js_word!("const")),
);
} else {
is_const = true;
}
}
"in" => {
is_in = true;
if !permit_in_out {
self.emit_err(self.input.prev_span(), SyntaxError::TS1274(js_word!("in")));
} else if is_in {
Expand All @@ -417,17 +417,14 @@ impl<I: Tokens> Parser<I> {
self.input.prev_span(),
SyntaxError::TS1029(js_word!("in"), js_word!("out")),
);
} else {
is_in = true;
}
}
"out" => {
is_out = true;
if !permit_in_out {
self.emit_err(self.input.prev_span(), SyntaxError::TS1274(js_word!("out")));
} else if is_out {
self.emit_err(self.input.prev_span(), SyntaxError::TS1030(js_word!("out")));
} else {
is_out = true;
}
}
other => self.emit_err(self.input.prev_span(), SyntaxError::TS1273(other.into())),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,152 @@

x 'out' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:1:1]
1 | type Covariant<out T> = {
: ^^^
2 | x: T;
`----

x 'in' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:10:1]
10 |
11 | type Contravariant<in T> = {
: ^^
12 | f: (x: T) => void;
`----

x 'in' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:20:1]
20 |
21 | type Invariant<in out T> = {
: ^^
22 | f: (x: T) => T;
`----

x 'out' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:20:1]
20 |
21 | type Invariant<in out T> = {
: ^^^
22 | f: (x: T) => T;
`----

x 'out' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:32:1]
32 |
33 | type T10<out T> = T;
: ^^^
34 | type T11<in T> = keyof T;
`----

x 'in' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:33:1]
33 | type T10<out T> = T;
34 | type T11<in T> = keyof T;
: ^^
35 | type T12<out T, out K extends keyof T> = T[K];
`----

x 'out' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:34:1]
34 | type T11<in T> = keyof T;
35 | type T12<out T, out K extends keyof T> = T[K];
: ^^^
36 | type T13<in out T> = T[keyof T];
`----

x 'out' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:34:1]
34 | type T11<in T> = keyof T;
35 | type T12<out T, out K extends keyof T> = T[K];
: ^^^
36 | type T13<in out T> = T[keyof T];
`----

x 'in' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:35:1]
35 | type T12<out T, out K extends keyof T> = T[K];
36 | type T13<in out T> = T[keyof T];
: ^^
`----

x 'out' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:35:1]
35 | type T12<out T, out K extends keyof T> = T[K];
36 | type T13<in out T> = T[keyof T];
: ^^^
`----

x 'in' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:39:1]
39 |
40 | type Covariant1<in T> = { // Error
: ^^
41 | x: T;
`----

x 'out' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:43:1]
43 |
44 | type Contravariant1<out T> = keyof T; // Error
: ^^^
`----

x 'out' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:45:1]
45 |
46 | type Contravariant2<out T> = { // Error
: ^^^
47 | f: (x: T) => void;
`----

x 'in' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:49:1]
49 |
50 | type Invariant1<in T> = { // Error
: ^^
51 | f: (x: T) => T;
`----

x 'out' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:53:1]
53 |
54 | type Invariant2<out T> = { // Error
: ^^^
55 | f: (x: T) => T;
`----

x 'in' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:59:1]
59 |
60 | type Foo1<in T> = { // Error
: ^^
61 | x: T;
`----

x 'out' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:70:1]
70 |
71 | type Foo2<out T> = { // Error
: ^^^
72 | x: T;
`----

x 'in' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:81:1]
81 |
82 | type Foo3<in out T> = {
: ^^
83 | x: T;
`----

x 'out' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:81:1]
81 |
82 | type Foo3<in out T> = {
: ^^^
83 | x: T;
`----

x 'public' modifier cannot appear on a type parameter
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:94:1]
94 |
Expand All @@ -10,11 +158,43 @@
x 'in' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:95:1]
95 | type T20<public T> = T; // Error
96 | type T21<in out in T> = T; // Error
: ^^
97 | type T22<in out out T> = T; // Error
`----

x 'out' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:95:1]
95 | type T20<public T> = T; // Error
96 | type T21<in out in T> = T; // Error
: ^^^
97 | type T22<in out out T> = T; // Error
`----

x 'in' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:95:1]
95 | type T20<public T> = T; // Error
96 | type T21<in out in T> = T; // Error
: ^^
97 | type T22<in out out T> = T; // Error
`----

x 'in' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:96:1]
96 | type T21<in out in T> = T; // Error
97 | type T22<in out out T> = T; // Error
: ^^
98 | type T23<out in T> = T; // Error
`----

x 'out' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:96:1]
96 | type T21<in out in T> = T; // Error
97 | type T22<in out out T> = T; // Error
: ^^^
98 | type T23<out in T> = T; // Error
`----

x 'out' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:96:1]
96 | type T21<in out in T> = T; // Error
Expand All @@ -23,7 +203,14 @@
98 | type T23<out in T> = T; // Error
`----

x 'in' modifier must precede 'out' modifier.
x 'out' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:97:1]
97 | type T22<in out out T> = T; // Error
98 | type T23<out in T> = T; // Error
: ^^^
`----

x 'in' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:97:1]
97 | type T22<in out out T> = T; // Error
98 | type T23<out in T> = T; // Error
Expand Down Expand Up @@ -60,3 +247,42 @@
: ^^^
106 | }
`----

x 'out' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:109:1]
109 |
110 | interface Baz<out T> {}
: ^^^
111 | interface Baz<in T> {}
`----

x 'in' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:110:1]
110 | interface Baz<out T> {}
111 | interface Baz<in T> {}
: ^^
`----

x 'out' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:120:1]
120 |
121 | interface Parent<out A> {
: ^^^
122 | child: Child<A> | null;
`----

x 'in' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:139:1]
139 |
140 | declare class StateNode<TContext, in out TEvent extends { type: string }> {
: ^^
141 | _storedEvent: TEvent;
`----

x 'out' modifier already seen.
,-[$DIR/tests/typescript-errors/variance-annotations/1/input.ts:139:1]
139 |
140 | declare class StateNode<TContext, in out TEvent extends { type: string }> {
: ^^^
141 | _storedEvent: TEvent;
`----
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const fn = <const Data extends Type>(payload: Data) => payload;

1 comment on commit 6614886

@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: 6614886 Previous: 01db30f Ratio
es/full/bugs-1 318761 ns/iter (± 10108) 310987 ns/iter (± 16623) 1.02
es/full/minify/libraries/antd 1540535456 ns/iter (± 19489631) 1781397600 ns/iter (± 30219133) 0.86
es/full/minify/libraries/d3 303248018 ns/iter (± 5263571) 327460891 ns/iter (± 4232900) 0.93
es/full/minify/libraries/echarts 1200152673 ns/iter (± 17577650) 1360038360 ns/iter (± 12264649) 0.88
es/full/minify/libraries/jquery 90883449 ns/iter (± 1218443) 100764211 ns/iter (± 2694558) 0.90
es/full/minify/libraries/lodash 105791052 ns/iter (± 1383415) 114258472 ns/iter (± 1657267) 0.93
es/full/minify/libraries/moment 52647009 ns/iter (± 613407) 56051808 ns/iter (± 909252) 0.94
es/full/minify/libraries/react 19201783 ns/iter (± 262000) 20932723 ns/iter (± 228381) 0.92
es/full/minify/libraries/terser 245826459 ns/iter (± 3029288) 295502667 ns/iter (± 6542611) 0.83
es/full/minify/libraries/three 446248919 ns/iter (± 8469340) 526162730 ns/iter (± 6071390) 0.85
es/full/minify/libraries/typescript 2904751083 ns/iter (± 14828970) 3414818458 ns/iter (± 18063098) 0.85
es/full/minify/libraries/victory 657328400 ns/iter (± 14513358) 809035184 ns/iter (± 15729455) 0.81
es/full/minify/libraries/vue 128735397 ns/iter (± 1332115) 152802856 ns/iter (± 4728462) 0.84
es/full/codegen/es3 28687 ns/iter (± 44) 28731 ns/iter (± 35) 1.00
es/full/codegen/es5 28746 ns/iter (± 52) 28762 ns/iter (± 53) 1.00
es/full/codegen/es2015 28766 ns/iter (± 54) 28758 ns/iter (± 28) 1.00
es/full/codegen/es2016 28819 ns/iter (± 48) 28815 ns/iter (± 63) 1.00
es/full/codegen/es2017 28819 ns/iter (± 75) 28768 ns/iter (± 38) 1.00
es/full/codegen/es2018 28796 ns/iter (± 64) 28782 ns/iter (± 40) 1.00
es/full/codegen/es2019 28762 ns/iter (± 41) 28784 ns/iter (± 73) 1.00
es/full/codegen/es2020 28745 ns/iter (± 61) 28762 ns/iter (± 60) 1.00
es/full/all/es3 183437772 ns/iter (± 3220962) 187440589 ns/iter (± 4127629) 0.98
es/full/all/es5 173658622 ns/iter (± 2729690) 176823383 ns/iter (± 4049776) 0.98
es/full/all/es2015 138215138 ns/iter (± 2232225) 138636022 ns/iter (± 1933832) 1.00
es/full/all/es2016 136728591 ns/iter (± 2473161) 135461524 ns/iter (± 3349038) 1.01
es/full/all/es2017 136008978 ns/iter (± 1746757) 134492978 ns/iter (± 2312005) 1.01
es/full/all/es2018 132256693 ns/iter (± 2736929) 132566535 ns/iter (± 3184680) 1.00
es/full/all/es2019 129481985 ns/iter (± 2862417) 130063263 ns/iter (± 3553001) 1.00
es/full/all/es2020 121559695 ns/iter (± 2443914) 121387588 ns/iter (± 1659426) 1.00
es/full/parser 519713 ns/iter (± 6665) 515005 ns/iter (± 10358) 1.01
es/full/base/fixer 22975 ns/iter (± 31) 22819 ns/iter (± 33) 1.01
es/full/base/resolver_and_hygiene 87298 ns/iter (± 388) 83326 ns/iter (± 94) 1.05
serialization of serde 120 ns/iter (± 0) 121 ns/iter (± 0) 0.99
css/minify/libraries/bootstrap 27403922 ns/iter (± 172175) 29127435 ns/iter (± 217886) 0.94
css/visitor/compare/clone 2125950 ns/iter (± 10613) 2150211 ns/iter (± 79035) 0.99
css/visitor/compare/visit_mut_span 2320011 ns/iter (± 5669) 2370471 ns/iter (± 16295) 0.98
css/visitor/compare/visit_mut_span_panic 2359653 ns/iter (± 4337) 2408985 ns/iter (± 14057) 0.98
css/visitor/compare/fold_span 3090593 ns/iter (± 13871) 3153412 ns/iter (± 80809) 0.98
css/visitor/compare/fold_span_panic 3240693 ns/iter (± 18263) 3326931 ns/iter (± 16756) 0.97
css/lexer/bootstrap_5_1_3 5120287 ns/iter (± 5710) 5148263 ns/iter (± 109408) 0.99
css/lexer/foundation_6_7_4 4322057 ns/iter (± 968) 4319727 ns/iter (± 7437) 1.00
css/lexer/tailwind_3_1_1 819325 ns/iter (± 238) 820270 ns/iter (± 163) 1.00
css/parser/bootstrap_5_1_3 21016435 ns/iter (± 39976) 22071583 ns/iter (± 147861) 0.95
css/parser/foundation_6_7_4 16776957 ns/iter (± 47684) 17693101 ns/iter (± 475164) 0.95
css/parser/tailwind_3_1_1 3238295 ns/iter (± 1981) 3324730 ns/iter (± 27268) 0.97
es/codegen/colors 326138 ns/iter (± 184574) 306631 ns/iter (± 173290) 1.06
es/codegen/large 1273638 ns/iter (± 659315) 1129709 ns/iter (± 564407) 1.13
es/codegen/with-parser/colors 47406 ns/iter (± 320) 47105 ns/iter (± 314) 1.01
es/codegen/with-parser/large 516292 ns/iter (± 978) 515105 ns/iter (± 1033) 1.00
es/minify/libraries/antd 1357794145 ns/iter (± 25557821) 1507532962 ns/iter (± 16489070) 0.90
es/minify/libraries/d3 253544134 ns/iter (± 4014358) 284330716 ns/iter (± 3538501) 0.89
es/minify/libraries/echarts 1045352703 ns/iter (± 12576466) 1164392654 ns/iter (± 4679526) 0.90
es/minify/libraries/jquery 79036411 ns/iter (± 1549596) 83237062 ns/iter (± 706295) 0.95
es/minify/libraries/lodash 95393996 ns/iter (± 2048208) 99422233 ns/iter (± 1667534) 0.96
es/minify/libraries/moment 45907089 ns/iter (± 567045) 47936411 ns/iter (± 483959) 0.96
es/minify/libraries/react 17290164 ns/iter (± 202946) 17786494 ns/iter (± 178256) 0.97
es/minify/libraries/terser 210138879 ns/iter (± 3826309) 233965961 ns/iter (± 2311305) 0.90
es/minify/libraries/three 361979261 ns/iter (± 6623358) 414643604 ns/iter (± 9000240) 0.87
es/minify/libraries/typescript 2472570770 ns/iter (± 12244433) 2787833062 ns/iter (± 27322859) 0.89
es/minify/libraries/victory 563215044 ns/iter (± 9468647) 655240208 ns/iter (± 12481010) 0.86
es/minify/libraries/vue 117522469 ns/iter (± 1411875) 124672099 ns/iter (± 2285814) 0.94
es/visitor/compare/clone 2318495 ns/iter (± 9462) 2352686 ns/iter (± 20036) 0.99
es/visitor/compare/visit_mut_span 2683595 ns/iter (± 20922) 2750719 ns/iter (± 13907) 0.98
es/visitor/compare/visit_mut_span_panic 2735370 ns/iter (± 6066) 2796696 ns/iter (± 13811) 0.98
es/visitor/compare/fold_span 3799477 ns/iter (± 6911) 3910334 ns/iter (± 20100) 0.97
es/visitor/compare/fold_span_panic 3938554 ns/iter (± 5854) 4047574 ns/iter (± 54368) 0.97
es/lexer/colors 13107 ns/iter (± 12) 13084 ns/iter (± 7) 1.00
es/lexer/angular 6383535 ns/iter (± 8768) 6345345 ns/iter (± 9034) 1.01
es/lexer/backbone 788908 ns/iter (± 5213) 783922 ns/iter (± 282) 1.01
es/lexer/jquery 4412595 ns/iter (± 3294) 4379053 ns/iter (± 1719) 1.01
es/lexer/jquery mobile 6898193 ns/iter (± 5754) 6864056 ns/iter (± 9051) 1.00
es/lexer/mootools 3461816 ns/iter (± 3146) 3438053 ns/iter (± 22277) 1.01
es/lexer/underscore 649772 ns/iter (± 375) 648236 ns/iter (± 119) 1.00
es/lexer/three 20824025 ns/iter (± 16736) 20887612 ns/iter (± 15405) 1.00
es/lexer/yui 3862512 ns/iter (± 2596) 3852983 ns/iter (± 996) 1.00
es/parser/colors 29345 ns/iter (± 80) 28854 ns/iter (± 52) 1.02
es/parser/angular 15264533 ns/iter (± 178132) 15995707 ns/iter (± 303691) 0.95
es/parser/backbone 2170485 ns/iter (± 13338) 2176085 ns/iter (± 10327) 1.00
es/parser/jquery 11793177 ns/iter (± 109992) 12415528 ns/iter (± 220949) 0.95
es/parser/jquery mobile 18343768 ns/iter (± 169759) 20582463 ns/iter (± 331497) 0.89
es/parser/mootools 8995344 ns/iter (± 24756) 9170740 ns/iter (± 51601) 0.98
es/parser/underscore 1831198 ns/iter (± 9836) 1837595 ns/iter (± 10662) 1.00
es/parser/three 53615139 ns/iter (± 670682) 57758441 ns/iter (± 285549) 0.93
es/parser/yui 9016924 ns/iter (± 39468) 9431017 ns/iter (± 154765) 0.96
es/preset-env/usage/builtin_type 143822 ns/iter (± 33833) 144997 ns/iter (± 36068) 0.99
es/preset-env/usage/property 21128 ns/iter (± 102) 21840 ns/iter (± 125) 0.97
es/resolver/typescript 115073624 ns/iter (± 4143878) 125143204 ns/iter (± 3708599) 0.92
es/fixer/typescript 81072585 ns/iter (± 1240885) 94996287 ns/iter (± 2253378) 0.85
es/hygiene/typescript 169817979 ns/iter (± 1840552) 201455406 ns/iter (± 1159470) 0.84
es/resolver_with_hygiene/typescript 301348666 ns/iter (± 2875570) 352253258 ns/iter (± 1665354) 0.86
es/visitor/base-perf/module_clone 80913 ns/iter (± 274) 81098 ns/iter (± 463) 1.00
es/visitor/base-perf/fold_empty 90970 ns/iter (± 348) 90735 ns/iter (± 333) 1.00
es/visitor/base-perf/fold_noop_impl_all 91145 ns/iter (± 432) 90871 ns/iter (± 364) 1.00
es/visitor/base-perf/fold_noop_impl_vec 91058 ns/iter (± 697) 90924 ns/iter (± 288) 1.00
es/visitor/base-perf/boxing_boxed_clone 56 ns/iter (± 0) 56 ns/iter (± 0) 1
es/visitor/base-perf/boxing_unboxed_clone 42 ns/iter (± 0) 41 ns/iter (± 0) 1.02
es/visitor/base-perf/boxing_boxed 102 ns/iter (± 0) 102 ns/iter (± 0) 1
es/visitor/base-perf/boxing_unboxed 79 ns/iter (± 0) 78 ns/iter (± 0) 1.01
es/visitor/base-perf/visit_contains_this 3485 ns/iter (± 60) 3624 ns/iter (± 73) 0.96
es/base/parallel/resolver/typescript 5923342132 ns/iter (± 331699496) 6427992707 ns/iter (± 620000710) 0.92
es/base/parallel/hygiene/typescript 2023302488 ns/iter (± 30496383) 2281148809 ns/iter (± 40553903) 0.89
misc/visitors/time-complexity/time 5 109 ns/iter (± 0) 103 ns/iter (± 0) 1.06
misc/visitors/time-complexity/time 10 356 ns/iter (± 0) 330 ns/iter (± 5) 1.08
misc/visitors/time-complexity/time 15 691 ns/iter (± 8) 649 ns/iter (± 0) 1.06
misc/visitors/time-complexity/time 20 1270 ns/iter (± 5) 1242 ns/iter (± 8) 1.02
misc/visitors/time-complexity/time 40 6798 ns/iter (± 45) 6571 ns/iter (± 73) 1.03
misc/visitors/time-complexity/time 60 17290 ns/iter (± 124) 17015 ns/iter (± 42) 1.02
es/full-target/es2016 253563 ns/iter (± 3813) 253426 ns/iter (± 436) 1.00
es/full-target/es2017 246813 ns/iter (± 344) 245689 ns/iter (± 397) 1.00
es/full-target/es2018 235957 ns/iter (± 424) 235023 ns/iter (± 223) 1.00
es2020_nullish_coalescing 92535 ns/iter (± 275) 92512 ns/iter (± 502) 1.00
es2020_optional_chaining 124632 ns/iter (± 287) 124853 ns/iter (± 337) 1.00
es2022_class_properties 149793 ns/iter (± 350) 149327 ns/iter (± 320) 1.00
es2018_object_rest_spread 96203 ns/iter (± 294) 95956 ns/iter (± 103) 1.00
es2019_optional_catch_binding 85294 ns/iter (± 109) 85239 ns/iter (± 200) 1.00
es2017_async_to_generator 85874 ns/iter (± 334) 85906 ns/iter (± 227) 1.00
es2016_exponentiation 89799 ns/iter (± 249) 90031 ns/iter (± 130) 1.00
es2015_arrow 94331 ns/iter (± 178) 94614 ns/iter (± 255) 1.00
es2015_block_scoped_fn 91873 ns/iter (± 181) 91616 ns/iter (± 230) 1.00
es2015_block_scoping 170091 ns/iter (± 382) 170330 ns/iter (± 257) 1.00

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

Please sign in to comment.