Skip to content

Commit 985f0ca

Browse files
authoredApr 29, 2023
fix(es/parser): Parse decorators after export (#7340)
1 parent b80ceae commit 985f0ca

File tree

12 files changed

+130
-2
lines changed

12 files changed

+130
-2
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"jsc": {
3+
"externalHelpers": true,
4+
"parser": {
5+
"syntax": "ecmascript",
6+
"jsx": true,
7+
"decorators": true,
8+
"dynamicImport": true,
9+
"decoratorsBeforeExport": true
10+
},
11+
"transform": {
12+
"legacyDecorator": true,
13+
"decoratorMetadata": true
14+
},
15+
"minify": {
16+
"compress": false
17+
}
18+
},
19+
"isModule": "unknown",
20+
"env": {
21+
"mode": "usage",
22+
"coreJs": "3",
23+
"dynamicImport": true
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
2+
import React from 'react'
3+
import { withRouter } from 'react-router-dom'
4+
5+
export default
6+
@withRouter
7+
class App extends React.Component {
8+
render() {
9+
console.log(this.props)
10+
return <div>134</div>
11+
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { _ as _class_call_check } from "@swc/helpers/_/_class_call_check";
2+
import { _ as _create_class } from "@swc/helpers/_/_create_class";
3+
import { _ as _inherits } from "@swc/helpers/_/_inherits";
4+
import { _ as _create_super } from "@swc/helpers/_/_create_super";
5+
import { _ as _ts_decorate } from "@swc/helpers/_/_ts_decorate";
6+
import React from "react";
7+
import { withRouter } from "react-router-dom";
8+
var App = function(_React_Component) {
9+
"use strict";
10+
_inherits(App, _React_Component);
11+
var _super = _create_super(App);
12+
function App() {
13+
_class_call_check(this, App);
14+
return _super.apply(this, arguments);
15+
}
16+
_create_class(App, [
17+
{
18+
key: "render",
19+
value: function render() {
20+
console.log(this.props);
21+
return React.createElement("div", null, "134");
22+
}
23+
}
24+
]);
25+
return App;
26+
}(React.Component);
27+
App = _ts_decorate([
28+
withRouter
29+
], App);
30+
export { App as default };

‎crates/swc_ecma_parser/src/error.rs

+4
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ pub enum SyntaxError {
270270
TS2499,
271271
TS2703,
272272
TS4112,
273+
TS8038,
273274
TSTypeAnnotationAfterAssign,
274275
TsNonNullAssertionNotAllowed(JsWord),
275276

@@ -691,6 +692,9 @@ impl SyntaxError {
691692
SyntaxError::TS4112 => "This member cannot have an 'override' modifier because its \
692693
containing class does not extend another class."
693694
.into(),
695+
SyntaxError::TS8038 => "Decorators may not appear after `export` or `export default` \
696+
if they also appear before `export`."
697+
.into(),
694698
SyntaxError::TSTypeAnnotationAfterAssign => {
695699
"Type annotations must come before default assignments".into()
696700
}

‎crates/swc_ecma_parser/src/parser/stmt/module_item.rs

+23-1
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ impl<I: Tokens> Parser<I> {
327327
Ok(self.with_ctx(ctx).parse_binding_ident()?.id)
328328
}
329329

330-
fn parse_export(&mut self, decorators: Vec<Decorator>) -> PResult<ModuleDecl> {
330+
fn parse_export(&mut self, mut decorators: Vec<Decorator>) -> PResult<ModuleDecl> {
331331
if !self.ctx().module {
332332
// Switch to module mode
333333
let ctx = Context {
@@ -417,6 +417,17 @@ impl<I: Tokens> Parser<I> {
417417
let mut export_default = None;
418418

419419
if !type_only && eat!(self, "default") {
420+
if is!(self, '@') {
421+
let start = cur_pos!(self);
422+
let after_decorators = self.parse_decorators(false)?;
423+
424+
if !decorators.is_empty() {
425+
syntax_error!(self, span!(self, start), SyntaxError::TS8038);
426+
}
427+
428+
decorators = after_decorators;
429+
}
430+
420431
if self.input.syntax().typescript() {
421432
if is!(self, "abstract")
422433
&& peeked_is!(self, "class")
@@ -477,6 +488,17 @@ impl<I: Tokens> Parser<I> {
477488
}
478489
}
479490

491+
if is!(self, '@') {
492+
let start = cur_pos!(self);
493+
let after_decorators = self.parse_decorators(false)?;
494+
495+
if !decorators.is_empty() {
496+
syntax_error!(self, span!(self, start), SyntaxError::TS8038);
497+
}
498+
499+
decorators = after_decorators;
500+
}
501+
480502
let decl = if !type_only && is!(self, "class") {
481503
let class_start = cur_pos!(self);
482504
self.parse_class_decl(start, class_start, decorators, false)?
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// @filename: file3.js
2+
3+
// error
4+
export @dec default class C3 {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
x Expected '{', got 'default'
3+
,-[$DIR/tests/typescript-errors/esDecorators/classDeclaration/esDecorators-classDeclaration-exportModifier/file3.ts:3:1]
4+
3 | // error
5+
4 | export @dec default class C3 {}
6+
: ^^^^^^^
7+
`----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// @filename: file6.js
2+
3+
// error
4+
@dec export @dec class C6 {}
5+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
x Decorators may not appear after `export` or `export default` if they also appear before `export`.
3+
,-[$DIR/tests/typescript-errors/esDecorators/classDeclaration/esDecorators-classDeclaration-exportModifier/file6.ts:3:1]
4+
3 | // error
5+
4 | @dec export @dec class C6 {}
6+
: ^^^^
7+
`----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// @filename: file7.js
2+
3+
// error
4+
@dec export default @dec class C7 {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
2+
x Decorators may not appear after `export` or `export default` if they also appear before `export`.
3+
,-[$DIR/tests/typescript-errors/esDecorators/classDeclaration/esDecorators-classDeclaration-exportModifier/file7.ts:3:1]
4+
3 | // error
5+
4 | @dec export default @dec class C7 {}
6+
: ^^^^
7+
`----

‎crates/swc_ecma_transforms/tests/fixture/legacy-only/decl-to-expression/class-decorators/output.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export default class A {
1+
let A = class A {
22
};
33
A = _ts_decorate([
44
dec
@@ -8,3 +8,4 @@ let B = class B {
88
B = _ts_decorate([
99
dec
1010
], B);
11+
export { A as default };

1 commit comments

Comments
 (1)

github-actions[bot] commented on Apr 29, 2023

@github-actions[bot]

Benchmark

Benchmark suite Current: 985f0ca Previous: d061d29 Ratio
es/full/bugs-1 310382 ns/iter (± 11312) 235080 ns/iter (± 11786) 1.32
es/full/minify/libraries/antd 1580358083 ns/iter (± 18770934) 1175142977 ns/iter (± 12208560) 1.34
es/full/minify/libraries/d3 306007948 ns/iter (± 7215326) 236847335 ns/iter (± 3367852) 1.29
es/full/minify/libraries/echarts 1193710964 ns/iter (± 27146913) 920982645 ns/iter (± 7567862) 1.30
es/full/minify/libraries/jquery 90387731 ns/iter (± 592880) 75654137 ns/iter (± 90238) 1.19
es/full/minify/libraries/lodash 105439573 ns/iter (± 469322) 85328261 ns/iter (± 178244) 1.24
es/full/minify/libraries/moment 52487457 ns/iter (± 252068) 44012496 ns/iter (± 128349) 1.19
es/full/minify/libraries/react 19013982 ns/iter (± 74744) 16091201 ns/iter (± 21907) 1.18
es/full/minify/libraries/terser 246669220 ns/iter (± 3907696) 192076025 ns/iter (± 659939) 1.28
es/full/minify/libraries/three 433148025 ns/iter (± 4602754) 329682278 ns/iter (± 638949) 1.31
es/full/minify/libraries/typescript 2926599526 ns/iter (± 21565572) 2310137274 ns/iter (± 8335458) 1.27
es/full/minify/libraries/victory 633775581 ns/iter (± 5102513) 491250516 ns/iter (± 2901004) 1.29
es/full/minify/libraries/vue 129407322 ns/iter (± 963957) 105952088 ns/iter (± 346388) 1.22
es/full/codegen/es3 35002 ns/iter (± 256) 25336 ns/iter (± 97) 1.38
es/full/codegen/es5 35129 ns/iter (± 117) 25453 ns/iter (± 70) 1.38
es/full/codegen/es2015 35197 ns/iter (± 63) 25458 ns/iter (± 39) 1.38
es/full/codegen/es2016 34980 ns/iter (± 53) 25483 ns/iter (± 26) 1.37
es/full/codegen/es2017 35029 ns/iter (± 106) 25474 ns/iter (± 69) 1.38
es/full/codegen/es2018 35087 ns/iter (± 101) 25469 ns/iter (± 47) 1.38
es/full/codegen/es2019 35220 ns/iter (± 68) 25403 ns/iter (± 67) 1.39
es/full/codegen/es2020 35233 ns/iter (± 49) 25455 ns/iter (± 52) 1.38
es/full/all/es3 178558844 ns/iter (± 2334108) 158305600 ns/iter (± 1338493) 1.13
es/full/all/es5 173897487 ns/iter (± 3418213) 150716107 ns/iter (± 763388) 1.15
es/full/all/es2015 136228528 ns/iter (± 2659714) 110612395 ns/iter (± 723889) 1.23
es/full/all/es2016 132374052 ns/iter (± 1628466) 109839004 ns/iter (± 434236) 1.21
es/full/all/es2017 131978959 ns/iter (± 1576928) 109106222 ns/iter (± 396216) 1.21
es/full/all/es2018 127142360 ns/iter (± 1279377) 107106025 ns/iter (± 429220) 1.19
es/full/all/es2019 125904305 ns/iter (± 2136196) 106154692 ns/iter (± 461620) 1.19
es/full/all/es2020 117860067 ns/iter (± 980907) 101379652 ns/iter (± 548962) 1.16
es/full/parser 512531 ns/iter (± 6677) 451498 ns/iter (± 4365) 1.14
es/full/base/fixer 23197 ns/iter (± 43) 17733 ns/iter (± 56) 1.31
es/full/base/resolver_and_hygiene 85628 ns/iter (± 66) 75875 ns/iter (± 184) 1.13
serialization of serde 121 ns/iter (± 0) 112 ns/iter (± 0) 1.08
css/minify/libraries/bootstrap 27468083 ns/iter (± 99432) 23367702 ns/iter (± 13966) 1.18
css/visitor/compare/clone 2107576 ns/iter (± 4621) 1710239 ns/iter (± 5038) 1.23
css/visitor/compare/visit_mut_span 2296141 ns/iter (± 6484) 1843980 ns/iter (± 3699) 1.25
css/visitor/compare/visit_mut_span_panic 2371668 ns/iter (± 5153) 1911749 ns/iter (± 4701) 1.24
css/visitor/compare/fold_span 3067975 ns/iter (± 11654) 2617996 ns/iter (± 23104) 1.17
css/visitor/compare/fold_span_panic 3247966 ns/iter (± 7616) 2809024 ns/iter (± 9083) 1.16
css/lexer/bootstrap_5_1_3 5125389 ns/iter (± 1161) 4470101 ns/iter (± 8176) 1.15
css/lexer/foundation_6_7_4 4318402 ns/iter (± 679) 3771868 ns/iter (± 1211) 1.14
css/lexer/tailwind_3_1_1 819812 ns/iter (± 209) 713734 ns/iter (± 594) 1.15
css/parser/bootstrap_5_1_3 21189420 ns/iter (± 83094) 18026116 ns/iter (± 21062) 1.18
css/parser/foundation_6_7_4 16816717 ns/iter (± 12219) 14452254 ns/iter (± 17106) 1.16
css/parser/tailwind_3_1_1 3262054 ns/iter (± 6049) 2777838 ns/iter (± 1828) 1.17
es/codegen/colors 328058 ns/iter (± 185350) 327803 ns/iter (± 185172) 1.00
es/codegen/large 1247504 ns/iter (± 656019) 1213234 ns/iter (± 642303) 1.03
es/codegen/with-parser/colors 47818 ns/iter (± 83) 41840 ns/iter (± 506) 1.14
es/codegen/with-parser/large 519667 ns/iter (± 1983) 468705 ns/iter (± 2044) 1.11
es/minify/libraries/antd 1317373054 ns/iter (± 11198392) 1011121079 ns/iter (± 6225077) 1.30
es/minify/libraries/d3 249043352 ns/iter (± 2225334) 202745343 ns/iter (± 359101) 1.23
es/minify/libraries/echarts 1016982799 ns/iter (± 10360862) 797257187 ns/iter (± 2551791) 1.28
es/minify/libraries/jquery 79016216 ns/iter (± 428739) 65890591 ns/iter (± 97023) 1.20
es/minify/libraries/lodash 94535590 ns/iter (± 535527) 76441669 ns/iter (± 129816) 1.24
es/minify/libraries/moment 45433204 ns/iter (± 127998) 38227731 ns/iter (± 42926) 1.19
es/minify/libraries/react 17020327 ns/iter (± 90760) 14287434 ns/iter (± 39964) 1.19
es/minify/libraries/terser 204699291 ns/iter (± 1733008) 165132473 ns/iter (± 254961) 1.24
es/minify/libraries/three 346327190 ns/iter (± 3948204) 274733476 ns/iter (± 817280) 1.26
es/minify/libraries/typescript 2474527346 ns/iter (± 10943393) 1989826743 ns/iter (± 7610370) 1.24
es/minify/libraries/victory 530450045 ns/iter (± 5769600) 406342788 ns/iter (± 1031431) 1.31
es/minify/libraries/vue 114607518 ns/iter (± 1096194) 93849822 ns/iter (± 440334) 1.22
es/visitor/compare/clone 2336378 ns/iter (± 10291) 1987315 ns/iter (± 6207) 1.18
es/visitor/compare/visit_mut_span 2699131 ns/iter (± 5210) 2327992 ns/iter (± 5903) 1.16
es/visitor/compare/visit_mut_span_panic 2740913 ns/iter (± 5695) 2347540 ns/iter (± 1575) 1.17
es/visitor/compare/fold_span 3796625 ns/iter (± 8600) 3369100 ns/iter (± 8553) 1.13
es/visitor/compare/fold_span_panic 3970975 ns/iter (± 14412) 3543594 ns/iter (± 3829) 1.12
es/lexer/colors 13187 ns/iter (± 15) 11437 ns/iter (± 54) 1.15
es/lexer/angular 6386454 ns/iter (± 45448) 5601272 ns/iter (± 2866) 1.14
es/lexer/backbone 788577 ns/iter (± 410) 722940 ns/iter (± 2174) 1.09
es/lexer/jquery 4408083 ns/iter (± 1874) 4075316 ns/iter (± 3419) 1.08
es/lexer/jquery mobile 6888736 ns/iter (± 2014) 6257869 ns/iter (± 5578) 1.10
es/lexer/mootools 3463306 ns/iter (± 990) 3235489 ns/iter (± 2502) 1.07
es/lexer/underscore 649349 ns/iter (± 157) 597771 ns/iter (± 1243) 1.09
es/lexer/three 20888995 ns/iter (± 36988) 19349400 ns/iter (± 622989) 1.08
es/lexer/yui 3868593 ns/iter (± 3135) 3535285 ns/iter (± 4527) 1.09
es/parser/colors 29265 ns/iter (± 52) 25857 ns/iter (± 69) 1.13
es/parser/angular 14893902 ns/iter (± 81628) 12945776 ns/iter (± 40756) 1.15
es/parser/backbone 2171839 ns/iter (± 11059) 1915566 ns/iter (± 9826) 1.13
es/parser/jquery 11774122 ns/iter (± 84694) 10374731 ns/iter (± 29656) 1.13
es/parser/jquery mobile 18313561 ns/iter (± 90582) 16061837 ns/iter (± 257968) 1.14
es/parser/mootools 8970395 ns/iter (± 14123) 8038864 ns/iter (± 11368) 1.12
es/parser/underscore 1834008 ns/iter (± 12145) 1648284 ns/iter (± 7776) 1.11
es/parser/three 52488024 ns/iter (± 627011) 44571873 ns/iter (± 166625) 1.18
es/parser/yui 9027034 ns/iter (± 52670) 7947813 ns/iter (± 29442) 1.14
es/preset-env/usage/builtin_type 140900 ns/iter (± 34453) 146282 ns/iter (± 40343) 0.96
es/preset-env/usage/property 19897 ns/iter (± 84) 15114 ns/iter (± 70) 1.32
es/resolver/typescript 115833501 ns/iter (± 2901493) 87707891 ns/iter (± 1110870) 1.32
es/fixer/typescript 80598397 ns/iter (± 3252343) 63391076 ns/iter (± 1484025) 1.27
es/hygiene/typescript 169154342 ns/iter (± 1308549) 128071696 ns/iter (± 563547) 1.32
es/resolver_with_hygiene/typescript 298378139 ns/iter (± 1477746) 228144564 ns/iter (± 1023374) 1.31
es/visitor/base-perf/module_clone 81007 ns/iter (± 525) 58417 ns/iter (± 274) 1.39
es/visitor/base-perf/fold_empty 91496 ns/iter (± 332) 63206 ns/iter (± 353) 1.45
es/visitor/base-perf/fold_noop_impl_all 91733 ns/iter (± 343) 62930 ns/iter (± 215) 1.46
es/visitor/base-perf/fold_noop_impl_vec 91510 ns/iter (± 304) 62884 ns/iter (± 267) 1.46
es/visitor/base-perf/boxing_boxed_clone 57 ns/iter (± 0) 52 ns/iter (± 0) 1.10
es/visitor/base-perf/boxing_unboxed_clone 42 ns/iter (± 0) 37 ns/iter (± 0) 1.14
es/visitor/base-perf/boxing_boxed 102 ns/iter (± 0) 108 ns/iter (± 0) 0.94
es/visitor/base-perf/boxing_unboxed 77 ns/iter (± 0) 76 ns/iter (± 0) 1.01
es/visitor/base-perf/visit_contains_this 3369 ns/iter (± 59) 2685 ns/iter (± 12) 1.25
es/base/parallel/resolver/typescript 5955558214 ns/iter (± 312000063) 3534455338 ns/iter (± 302210628) 1.69
es/base/parallel/hygiene/typescript 1988972673 ns/iter (± 19772854) 1418999826 ns/iter (± 19545344) 1.40
misc/visitors/time-complexity/time 5 98 ns/iter (± 0) 102 ns/iter (± 0) 0.96
misc/visitors/time-complexity/time 10 332 ns/iter (± 1) 287 ns/iter (± 0) 1.16
misc/visitors/time-complexity/time 15 654 ns/iter (± 11) 484 ns/iter (± 0) 1.35
misc/visitors/time-complexity/time 20 1201 ns/iter (± 0) 1010 ns/iter (± 15) 1.19
misc/visitors/time-complexity/time 40 5957 ns/iter (± 27) 3395 ns/iter (± 4) 1.75
misc/visitors/time-complexity/time 60 13260 ns/iter (± 1) 7151 ns/iter (± 6) 1.85
es/full-target/es2016 254483 ns/iter (± 874) 222983 ns/iter (± 484) 1.14
es/full-target/es2017 246907 ns/iter (± 472) 211901 ns/iter (± 404) 1.17
es/full-target/es2018 236263 ns/iter (± 564) 201021 ns/iter (± 434) 1.18
es2020_nullish_coalescing 93058 ns/iter (± 369) 67394 ns/iter (± 428) 1.38
es2020_optional_chaining 125131 ns/iter (± 262) 95827 ns/iter (± 279) 1.31
es2022_class_properties 149980 ns/iter (± 315) 116284 ns/iter (± 298) 1.29
es2018_object_rest_spread 96081 ns/iter (± 157) 72787 ns/iter (± 260) 1.32
es2019_optional_catch_binding 85329 ns/iter (± 178) 61714 ns/iter (± 359) 1.38
es2017_async_to_generator 85583 ns/iter (± 223) 62548 ns/iter (± 205) 1.37
es2016_exponentiation 90305 ns/iter (± 242) 65691 ns/iter (± 251) 1.37
es2015_arrow 94109 ns/iter (± 324) 69383 ns/iter (± 193) 1.36
es2015_block_scoped_fn 91848 ns/iter (± 175) 66152 ns/iter (± 185) 1.39
es2015_block_scoping 169465 ns/iter (± 301) 118792 ns/iter (± 515) 1.43

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

Please sign in to comment.