From 4964bb31bb0b9f3615d5a2ed1f16d95cc921757f Mon Sep 17 00:00:00 2001 From: ANDO Yasushi Date: Tue, 19 Apr 2022 12:33:26 +0900 Subject: [PATCH 1/5] fix: export default in namespace #2200 --- src/diagnosticMessages.json | 1 + src/program.ts | 7 +++++++ tests/compiler/export-default-in-namespace.json | 7 +++++++ tests/compiler/export-default-in-namespace.ts | 3 +++ 4 files changed, 18 insertions(+) create mode 100644 tests/compiler/export-default-in-namespace.json create mode 100644 tests/compiler/export-default-in-namespace.ts diff --git a/src/diagnosticMessages.json b/src/diagnosticMessages.json index 5c9a03e6f2..e7fffe2a9c 100644 --- a/src/diagnosticMessages.json +++ b/src/diagnosticMessages.json @@ -114,6 +114,7 @@ "A definite assignment assertion '!' is not permitted in this context.": 1255, "A class may only extend another class.": 1311, "A parameter property cannot be declared using a rest parameter.": 1317, + "A default export can only be used in an ECMAScript-style module.": 1319, "An identifier or keyword cannot immediately follow a numeric literal.": 1351, "Duplicate identifier '{0}'.": 2300, diff --git a/src/program.ts b/src/program.ts index 4e28ba2478..a7e9088b8c 100644 --- a/src/program.ts +++ b/src/program.ts @@ -2565,6 +2565,13 @@ export class Program extends DiagnosticEmitter { this.initializeVariables(member, original); break; } + case NodeKind.EXPORT: { + this.error( + DiagnosticCode.A_default_export_can_only_be_used_in_an_ECMAScript_style_module, + member.range, + ); + break; + } default: assert(false); // namespace member expected } } diff --git a/tests/compiler/export-default-in-namespace.json b/tests/compiler/export-default-in-namespace.json new file mode 100644 index 0000000000..17a1fb1893 --- /dev/null +++ b/tests/compiler/export-default-in-namespace.json @@ -0,0 +1,7 @@ +{ + "asc_flags": [ + ], + "stderr": [ + "TS1319: A default export can only be used in an ECMAScript-style module." + ] +} diff --git a/tests/compiler/export-default-in-namespace.ts b/tests/compiler/export-default-in-namespace.ts new file mode 100644 index 0000000000..de7766b2e1 --- /dev/null +++ b/tests/compiler/export-default-in-namespace.ts @@ -0,0 +1,3 @@ +namespace Foo { + export default foo; +} From 3b00530dff34d4755b6ab5cdde592eb503e001a2 Mon Sep 17 00:00:00 2001 From: ANDO Yasushi Date: Tue, 19 Apr 2022 21:43:25 +0900 Subject: [PATCH 2/5] check during parsing, change error message --- src/diagnosticMessages.json | 2 +- src/parser.ts | 12 ++++++++++-- src/program.ts | 7 ------- tests/compiler/export-default-in-namespace.json | 7 ------- .../export-default-in-namespace.ts | 0 .../parser/export-default-in-namespace.ts.fixture.ts | 1 + 6 files changed, 12 insertions(+), 17 deletions(-) delete mode 100644 tests/compiler/export-default-in-namespace.json rename tests/{compiler => parser}/export-default-in-namespace.ts (100%) create mode 100644 tests/parser/export-default-in-namespace.ts.fixture.ts diff --git a/src/diagnosticMessages.json b/src/diagnosticMessages.json index e7fffe2a9c..c77e0e9519 100644 --- a/src/diagnosticMessages.json +++ b/src/diagnosticMessages.json @@ -114,7 +114,7 @@ "A definite assignment assertion '!' is not permitted in this context.": 1255, "A class may only extend another class.": 1311, "A parameter property cannot be declared using a rest parameter.": 1317, - "A default export can only be used in an ECMAScript-style module.": 1319, + "A default export can only be used in a module.": 1319, "An identifier or keyword cannot immediately follow a numeric literal.": 1351, "Duplicate identifier '{0}'.": 2300, diff --git a/src/parser.ts b/src/parser.ts index b9dc2fc7b3..08bf51e1dc 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -2483,8 +2483,16 @@ export class Parser extends DiagnosticEmitter { ); while (!tn.skip(Token.CLOSEBRACE)) { let member = this.parseTopLevelStatement(tn, declaration); - if (member) members.push(member); - else { + if (member) { + if (member.kind == NodeKind.EXPORT) { + this.error( + DiagnosticCode.A_default_export_can_only_be_used_in_a_module, + member.range, + ); + return null; + } + members.push(member); + } else { this.skipStatement(tn); if (tn.skip(Token.ENDOFFILE)) { this.error( diff --git a/src/program.ts b/src/program.ts index a7e9088b8c..4e28ba2478 100644 --- a/src/program.ts +++ b/src/program.ts @@ -2565,13 +2565,6 @@ export class Program extends DiagnosticEmitter { this.initializeVariables(member, original); break; } - case NodeKind.EXPORT: { - this.error( - DiagnosticCode.A_default_export_can_only_be_used_in_an_ECMAScript_style_module, - member.range, - ); - break; - } default: assert(false); // namespace member expected } } diff --git a/tests/compiler/export-default-in-namespace.json b/tests/compiler/export-default-in-namespace.json deleted file mode 100644 index 17a1fb1893..0000000000 --- a/tests/compiler/export-default-in-namespace.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "asc_flags": [ - ], - "stderr": [ - "TS1319: A default export can only be used in an ECMAScript-style module." - ] -} diff --git a/tests/compiler/export-default-in-namespace.ts b/tests/parser/export-default-in-namespace.ts similarity index 100% rename from tests/compiler/export-default-in-namespace.ts rename to tests/parser/export-default-in-namespace.ts diff --git a/tests/parser/export-default-in-namespace.ts.fixture.ts b/tests/parser/export-default-in-namespace.ts.fixture.ts new file mode 100644 index 0000000000..5f0dfe42e8 --- /dev/null +++ b/tests/parser/export-default-in-namespace.ts.fixture.ts @@ -0,0 +1 @@ +// ERROR 1319: "A default export can only be used in a module." in export-default-in-namespace.ts(2,3+18) From 8dfa4c791ef0a84c81162171d29b0eca7ad85652 Mon Sep 17 00:00:00 2001 From: ANDO Yasushi Date: Wed, 20 Apr 2022 12:26:55 +0900 Subject: [PATCH 3/5] to rerun bootstrap test --- tests/parser/export-default-in-namespace.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/parser/export-default-in-namespace.ts b/tests/parser/export-default-in-namespace.ts index de7766b2e1..a9f1432bb6 100644 --- a/tests/parser/export-default-in-namespace.ts +++ b/tests/parser/export-default-in-namespace.ts @@ -1,3 +1,3 @@ namespace Foo { - export default foo; + export default bar; } From 58371057fd79039c1a0a39762f37044cb761a85d Mon Sep 17 00:00:00 2001 From: ANDO Yasushi Date: Wed, 20 Apr 2022 12:35:34 +0900 Subject: [PATCH 4/5] check during compiling --- src/parser.ts | 12 ++---------- src/program.ts | 7 +++++++ tests/compiler/export-default-in-namespace.json | 7 +++++++ .../export-default-in-namespace.ts | 0 .../parser/export-default-in-namespace.ts.fixture.ts | 1 - 5 files changed, 16 insertions(+), 11 deletions(-) create mode 100644 tests/compiler/export-default-in-namespace.json rename tests/{parser => compiler}/export-default-in-namespace.ts (100%) delete mode 100644 tests/parser/export-default-in-namespace.ts.fixture.ts diff --git a/src/parser.ts b/src/parser.ts index 08bf51e1dc..b9dc2fc7b3 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -2483,16 +2483,8 @@ export class Parser extends DiagnosticEmitter { ); while (!tn.skip(Token.CLOSEBRACE)) { let member = this.parseTopLevelStatement(tn, declaration); - if (member) { - if (member.kind == NodeKind.EXPORT) { - this.error( - DiagnosticCode.A_default_export_can_only_be_used_in_a_module, - member.range, - ); - return null; - } - members.push(member); - } else { + if (member) members.push(member); + else { this.skipStatement(tn); if (tn.skip(Token.ENDOFFILE)) { this.error( diff --git a/src/program.ts b/src/program.ts index 4e28ba2478..b44d761108 100644 --- a/src/program.ts +++ b/src/program.ts @@ -2565,6 +2565,13 @@ export class Program extends DiagnosticEmitter { this.initializeVariables(member, original); break; } + case NodeKind.EXPORT: { + this.error( + DiagnosticCode.A_default_export_can_only_be_used_in_a_module, + member.range, + ); + break; + } default: assert(false); // namespace member expected } } diff --git a/tests/compiler/export-default-in-namespace.json b/tests/compiler/export-default-in-namespace.json new file mode 100644 index 0000000000..3d6bb89e4c --- /dev/null +++ b/tests/compiler/export-default-in-namespace.json @@ -0,0 +1,7 @@ +{ + "asc_flags": [ + ], + "stderr": [ + "TS1319: A default export can only be used in a module." + ] +} diff --git a/tests/parser/export-default-in-namespace.ts b/tests/compiler/export-default-in-namespace.ts similarity index 100% rename from tests/parser/export-default-in-namespace.ts rename to tests/compiler/export-default-in-namespace.ts diff --git a/tests/parser/export-default-in-namespace.ts.fixture.ts b/tests/parser/export-default-in-namespace.ts.fixture.ts deleted file mode 100644 index 5f0dfe42e8..0000000000 --- a/tests/parser/export-default-in-namespace.ts.fixture.ts +++ /dev/null @@ -1 +0,0 @@ -// ERROR 1319: "A default export can only be used in a module." in export-default-in-namespace.ts(2,3+18) From 50bcd4b6c09465e02450098d68fcead1cc209136 Mon Sep 17 00:00:00 2001 From: ANDO Yasushi Date: Wed, 20 Apr 2022 12:39:43 +0900 Subject: [PATCH 5/5] Revert "check during compiling" This reverts commit 58371057fd79039c1a0a39762f37044cb761a85d. --- src/parser.ts | 12 ++++++++++-- src/program.ts | 7 ------- tests/compiler/export-default-in-namespace.json | 7 ------- .../export-default-in-namespace.ts | 0 .../parser/export-default-in-namespace.ts.fixture.ts | 1 + 5 files changed, 11 insertions(+), 16 deletions(-) delete mode 100644 tests/compiler/export-default-in-namespace.json rename tests/{compiler => parser}/export-default-in-namespace.ts (100%) create mode 100644 tests/parser/export-default-in-namespace.ts.fixture.ts diff --git a/src/parser.ts b/src/parser.ts index b9dc2fc7b3..08bf51e1dc 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -2483,8 +2483,16 @@ export class Parser extends DiagnosticEmitter { ); while (!tn.skip(Token.CLOSEBRACE)) { let member = this.parseTopLevelStatement(tn, declaration); - if (member) members.push(member); - else { + if (member) { + if (member.kind == NodeKind.EXPORT) { + this.error( + DiagnosticCode.A_default_export_can_only_be_used_in_a_module, + member.range, + ); + return null; + } + members.push(member); + } else { this.skipStatement(tn); if (tn.skip(Token.ENDOFFILE)) { this.error( diff --git a/src/program.ts b/src/program.ts index b44d761108..4e28ba2478 100644 --- a/src/program.ts +++ b/src/program.ts @@ -2565,13 +2565,6 @@ export class Program extends DiagnosticEmitter { this.initializeVariables(member, original); break; } - case NodeKind.EXPORT: { - this.error( - DiagnosticCode.A_default_export_can_only_be_used_in_a_module, - member.range, - ); - break; - } default: assert(false); // namespace member expected } } diff --git a/tests/compiler/export-default-in-namespace.json b/tests/compiler/export-default-in-namespace.json deleted file mode 100644 index 3d6bb89e4c..0000000000 --- a/tests/compiler/export-default-in-namespace.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "asc_flags": [ - ], - "stderr": [ - "TS1319: A default export can only be used in a module." - ] -} diff --git a/tests/compiler/export-default-in-namespace.ts b/tests/parser/export-default-in-namespace.ts similarity index 100% rename from tests/compiler/export-default-in-namespace.ts rename to tests/parser/export-default-in-namespace.ts diff --git a/tests/parser/export-default-in-namespace.ts.fixture.ts b/tests/parser/export-default-in-namespace.ts.fixture.ts new file mode 100644 index 0000000000..5f0dfe42e8 --- /dev/null +++ b/tests/parser/export-default-in-namespace.ts.fixture.ts @@ -0,0 +1 @@ +// ERROR 1319: "A default export can only be used in a module." in export-default-in-namespace.ts(2,3+18)