Skip to content

Commit 88f3593

Browse files
EvanCahillweswigham
authored andcommitted
Fix error when exporting const enums (microsoft#33060) (microsoft#34721)
* Allow export declaration to reference const enums * Update baselines * Add test to verify reexported const enums are elided
1 parent f12eee2 commit 88f3593

11 files changed

+224
-241
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27465,7 +27465,7 @@ namespace ts {
2746527465
(node.parent.kind === SyntaxKind.ElementAccessExpression && (<ElementAccessExpression>node.parent).expression === node) ||
2746627466
((node.kind === SyntaxKind.Identifier || node.kind === SyntaxKind.QualifiedName) && isInRightSideOfImportOrExportAssignment(<Identifier>node) ||
2746727467
(node.parent.kind === SyntaxKind.TypeQuery && (<TypeQueryNode>node.parent).exprName === node)) ||
27468-
(node.parent.kind === SyntaxKind.ExportSpecifier && (compilerOptions.preserveConstEnums || node.flags & NodeFlags.Ambient)); // We allow reexporting const enums
27468+
(node.parent.kind === SyntaxKind.ExportSpecifier); // We allow reexporting const enums
2746927469

2747027470
if (!ok) {
2747127471
error(node, Diagnostics.const_enums_can_only_be_used_in_property_or_index_access_expressions_or_the_right_hand_side_of_an_import_declaration_or_export_assignment_or_type_query);
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
//// [tests/cases/compiler/constEnumNoEmitReexport.ts] ////
2+
3+
//// [ConstEnum.ts]
4+
export const enum MyConstEnum {
5+
Foo,
6+
Bar
7+
};
8+
//// [ImportExport.ts]
9+
import { MyConstEnum } from './ConstEnum';
10+
export { MyConstEnum };
11+
//// [ImportExportDefault.ts]
12+
import { MyConstEnum } from './ConstEnum';
13+
export default MyConstEnum;
14+
//// [ReExportDefault.ts]
15+
export { MyConstEnum as default } from './ConstEnum';
16+
//// [ReExport.ts]
17+
export { MyConstEnum } from './ConstEnum';
18+
//// [Usage1.ts]
19+
import MyConstEnum1 from './ImportExportDefault';
20+
import MyConstEnum2 from './ReExportDefault';
21+
MyConstEnum1.Foo;
22+
MyConstEnum2.Foo;
23+
//// [Usage2.ts]
24+
import { MyConstEnum } from './ImportExport';
25+
MyConstEnum.Foo;
26+
//// [Usage3.ts]
27+
import { MyConstEnum } from './ReExport';
28+
MyConstEnum.Foo;
29+
30+
31+
//// [ConstEnum.js]
32+
"use strict";
33+
exports.__esModule = true;
34+
;
35+
//// [ImportExport.js]
36+
"use strict";
37+
exports.__esModule = true;
38+
//// [ImportExportDefault.js]
39+
"use strict";
40+
exports.__esModule = true;
41+
//// [ReExportDefault.js]
42+
"use strict";
43+
exports.__esModule = true;
44+
//// [ReExport.js]
45+
"use strict";
46+
exports.__esModule = true;
47+
//// [Usage1.js]
48+
"use strict";
49+
exports.__esModule = true;
50+
0 /* Foo */;
51+
0 /* Foo */;
52+
//// [Usage2.js]
53+
"use strict";
54+
exports.__esModule = true;
55+
0 /* Foo */;
56+
//// [Usage3.js]
57+
"use strict";
58+
exports.__esModule = true;
59+
0 /* Foo */;
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
=== tests/cases/compiler/ConstEnum.ts ===
2+
export const enum MyConstEnum {
3+
>MyConstEnum : Symbol(MyConstEnum, Decl(ConstEnum.ts, 0, 0))
4+
5+
Foo,
6+
>Foo : Symbol(MyConstEnum.Foo, Decl(ConstEnum.ts, 0, 31))
7+
8+
Bar
9+
>Bar : Symbol(MyConstEnum.Bar, Decl(ConstEnum.ts, 1, 8))
10+
11+
};
12+
=== tests/cases/compiler/ImportExport.ts ===
13+
import { MyConstEnum } from './ConstEnum';
14+
>MyConstEnum : Symbol(MyConstEnum, Decl(ImportExport.ts, 0, 8))
15+
16+
export { MyConstEnum };
17+
>MyConstEnum : Symbol(MyConstEnum, Decl(ImportExport.ts, 1, 8))
18+
19+
=== tests/cases/compiler/ImportExportDefault.ts ===
20+
import { MyConstEnum } from './ConstEnum';
21+
>MyConstEnum : Symbol(MyConstEnum, Decl(ImportExportDefault.ts, 0, 8))
22+
23+
export default MyConstEnum;
24+
>MyConstEnum : Symbol(MyConstEnum, Decl(ImportExportDefault.ts, 0, 8))
25+
26+
=== tests/cases/compiler/ReExportDefault.ts ===
27+
export { MyConstEnum as default } from './ConstEnum';
28+
>MyConstEnum : Symbol(MyConstEnum, Decl(ConstEnum.ts, 0, 0))
29+
>default : Symbol(default, Decl(ReExportDefault.ts, 0, 8))
30+
31+
=== tests/cases/compiler/ReExport.ts ===
32+
export { MyConstEnum } from './ConstEnum';
33+
>MyConstEnum : Symbol(MyConstEnum, Decl(ReExport.ts, 0, 8))
34+
35+
=== tests/cases/compiler/Usage1.ts ===
36+
import MyConstEnum1 from './ImportExportDefault';
37+
>MyConstEnum1 : Symbol(MyConstEnum1, Decl(Usage1.ts, 0, 6))
38+
39+
import MyConstEnum2 from './ReExportDefault';
40+
>MyConstEnum2 : Symbol(MyConstEnum2, Decl(Usage1.ts, 1, 6))
41+
42+
MyConstEnum1.Foo;
43+
>MyConstEnum1.Foo : Symbol(MyConstEnum1.Foo, Decl(ConstEnum.ts, 0, 31))
44+
>MyConstEnum1 : Symbol(MyConstEnum1, Decl(Usage1.ts, 0, 6))
45+
>Foo : Symbol(MyConstEnum1.Foo, Decl(ConstEnum.ts, 0, 31))
46+
47+
MyConstEnum2.Foo;
48+
>MyConstEnum2.Foo : Symbol(MyConstEnum1.Foo, Decl(ConstEnum.ts, 0, 31))
49+
>MyConstEnum2 : Symbol(MyConstEnum2, Decl(Usage1.ts, 1, 6))
50+
>Foo : Symbol(MyConstEnum1.Foo, Decl(ConstEnum.ts, 0, 31))
51+
52+
=== tests/cases/compiler/Usage2.ts ===
53+
import { MyConstEnum } from './ImportExport';
54+
>MyConstEnum : Symbol(MyConstEnum, Decl(Usage2.ts, 0, 8))
55+
56+
MyConstEnum.Foo;
57+
>MyConstEnum.Foo : Symbol(MyConstEnum.Foo, Decl(ConstEnum.ts, 0, 31))
58+
>MyConstEnum : Symbol(MyConstEnum, Decl(Usage2.ts, 0, 8))
59+
>Foo : Symbol(MyConstEnum.Foo, Decl(ConstEnum.ts, 0, 31))
60+
61+
=== tests/cases/compiler/Usage3.ts ===
62+
import { MyConstEnum } from './ReExport';
63+
>MyConstEnum : Symbol(MyConstEnum, Decl(Usage3.ts, 0, 8))
64+
65+
MyConstEnum.Foo;
66+
>MyConstEnum.Foo : Symbol(MyConstEnum.Foo, Decl(ConstEnum.ts, 0, 31))
67+
>MyConstEnum : Symbol(MyConstEnum, Decl(Usage3.ts, 0, 8))
68+
>Foo : Symbol(MyConstEnum.Foo, Decl(ConstEnum.ts, 0, 31))
69+
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
=== tests/cases/compiler/ConstEnum.ts ===
2+
export const enum MyConstEnum {
3+
>MyConstEnum : MyConstEnum
4+
5+
Foo,
6+
>Foo : MyConstEnum.Foo
7+
8+
Bar
9+
>Bar : MyConstEnum.Bar
10+
11+
};
12+
=== tests/cases/compiler/ImportExport.ts ===
13+
import { MyConstEnum } from './ConstEnum';
14+
>MyConstEnum : typeof MyConstEnum
15+
16+
export { MyConstEnum };
17+
>MyConstEnum : typeof MyConstEnum
18+
19+
=== tests/cases/compiler/ImportExportDefault.ts ===
20+
import { MyConstEnum } from './ConstEnum';
21+
>MyConstEnum : typeof MyConstEnum
22+
23+
export default MyConstEnum;
24+
>MyConstEnum : MyConstEnum
25+
26+
=== tests/cases/compiler/ReExportDefault.ts ===
27+
export { MyConstEnum as default } from './ConstEnum';
28+
>MyConstEnum : typeof import("tests/cases/compiler/ConstEnum").MyConstEnum
29+
>default : typeof import("tests/cases/compiler/ConstEnum").MyConstEnum
30+
31+
=== tests/cases/compiler/ReExport.ts ===
32+
export { MyConstEnum } from './ConstEnum';
33+
>MyConstEnum : typeof import("tests/cases/compiler/ConstEnum").MyConstEnum
34+
35+
=== tests/cases/compiler/Usage1.ts ===
36+
import MyConstEnum1 from './ImportExportDefault';
37+
>MyConstEnum1 : typeof MyConstEnum1
38+
39+
import MyConstEnum2 from './ReExportDefault';
40+
>MyConstEnum2 : typeof MyConstEnum1
41+
42+
MyConstEnum1.Foo;
43+
>MyConstEnum1.Foo : MyConstEnum1.Foo
44+
>MyConstEnum1 : typeof MyConstEnum1
45+
>Foo : MyConstEnum1.Foo
46+
47+
MyConstEnum2.Foo;
48+
>MyConstEnum2.Foo : MyConstEnum1.Foo
49+
>MyConstEnum2 : typeof MyConstEnum1
50+
>Foo : MyConstEnum1.Foo
51+
52+
=== tests/cases/compiler/Usage2.ts ===
53+
import { MyConstEnum } from './ImportExport';
54+
>MyConstEnum : typeof MyConstEnum
55+
56+
MyConstEnum.Foo;
57+
>MyConstEnum.Foo : MyConstEnum.Foo
58+
>MyConstEnum : typeof MyConstEnum
59+
>Foo : MyConstEnum.Foo
60+
61+
=== tests/cases/compiler/Usage3.ts ===
62+
import { MyConstEnum } from './ReExport';
63+
>MyConstEnum : typeof MyConstEnum
64+
65+
MyConstEnum.Foo;
66+
>MyConstEnum.Foo : MyConstEnum.Foo
67+
>MyConstEnum : typeof MyConstEnum
68+
>Foo : MyConstEnum.Foo
69+

tests/baselines/reference/exportsAndImports1-amd.errors.txt

Lines changed: 0 additions & 40 deletions
This file was deleted.

tests/baselines/reference/exportsAndImports1-es6.errors.txt

Lines changed: 0 additions & 40 deletions
This file was deleted.

tests/baselines/reference/exportsAndImports1.errors.txt

Lines changed: 0 additions & 40 deletions
This file was deleted.

tests/baselines/reference/exportsAndImports3-amd.errors.txt

Lines changed: 0 additions & 40 deletions
This file was deleted.

0 commit comments

Comments
 (0)