Skip to content

Commit 1445bd4

Browse files
authored
Reissue used before declaration error for const enums in isolatedModules (#57174)
1 parent 8c34b56 commit 1445bd4

16 files changed

+464
-3
lines changed

src/compiler/checker.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3924,6 +3924,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
39243924
else if (result.flags & SymbolFlags.RegularEnum) {
39253925
diagnosticMessage = error(errorLocation, Diagnostics.Enum_0_used_before_its_declaration, declarationName);
39263926
}
3927+
else {
3928+
Debug.assert(!!(result.flags & SymbolFlags.ConstEnum));
3929+
if (getIsolatedModules(compilerOptions)) {
3930+
diagnosticMessage = error(errorLocation, Diagnostics.Enum_0_used_before_its_declaration, declarationName);
3931+
}
3932+
}
39273933

39283934
if (diagnosticMessage) {
39293935
addRelatedInfo(diagnosticMessage, createDiagnosticForNode(declaration, Diagnostics._0_is_declared_here, declarationName));

tests/baselines/reference/blockScopedEnumVariablesUseBeforeDef.errors.txt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,13 @@ blockScopedEnumVariablesUseBeforeDef.ts(2,12): error TS2450: Enum 'E' used befor
1313
function foo2() {
1414
return E.A
1515
const enum E { A }
16-
}
16+
}
17+
18+
const config = {
19+
a: AfterObject.A,
20+
};
21+
22+
const enum AfterObject {
23+
A = 2,
24+
}
25+

tests/baselines/reference/blockScopedEnumVariablesUseBeforeDef.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,16 @@ function foo1() {
99
function foo2() {
1010
return E.A
1111
const enum E { A }
12-
}
12+
}
13+
14+
const config = {
15+
a: AfterObject.A,
16+
};
17+
18+
const enum AfterObject {
19+
A = 2,
20+
}
21+
1322

1423
//// [blockScopedEnumVariablesUseBeforeDef.js]
1524
function foo1() {
@@ -22,3 +31,6 @@ function foo1() {
2231
function foo2() {
2332
return 0 /* E.A */;
2433
}
34+
var config = {
35+
a: 2 /* AfterObject.A */,
36+
};

tests/baselines/reference/blockScopedEnumVariablesUseBeforeDef.symbols

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,22 @@ function foo2() {
2626
>E : Symbol(E, Decl(blockScopedEnumVariablesUseBeforeDef.ts, 6, 14))
2727
>A : Symbol(E.A, Decl(blockScopedEnumVariablesUseBeforeDef.ts, 7, 18))
2828
}
29+
30+
const config = {
31+
>config : Symbol(config, Decl(blockScopedEnumVariablesUseBeforeDef.ts, 10, 5))
32+
33+
a: AfterObject.A,
34+
>a : Symbol(a, Decl(blockScopedEnumVariablesUseBeforeDef.ts, 10, 16))
35+
>AfterObject.A : Symbol(AfterObject.A, Decl(blockScopedEnumVariablesUseBeforeDef.ts, 14, 24))
36+
>AfterObject : Symbol(AfterObject, Decl(blockScopedEnumVariablesUseBeforeDef.ts, 12, 2))
37+
>A : Symbol(AfterObject.A, Decl(blockScopedEnumVariablesUseBeforeDef.ts, 14, 24))
38+
39+
};
40+
41+
const enum AfterObject {
42+
>AfterObject : Symbol(AfterObject, Decl(blockScopedEnumVariablesUseBeforeDef.ts, 12, 2))
43+
44+
A = 2,
45+
>A : Symbol(AfterObject.A, Decl(blockScopedEnumVariablesUseBeforeDef.ts, 14, 24))
46+
}
47+

tests/baselines/reference/blockScopedEnumVariablesUseBeforeDef.types

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,24 @@ function foo2() {
2626
>E : E
2727
>A : E.A
2828
}
29+
30+
const config = {
31+
>config : { a: AfterObject; }
32+
>{ a: AfterObject.A,} : { a: AfterObject; }
33+
34+
a: AfterObject.A,
35+
>a : AfterObject
36+
>AfterObject.A : AfterObject
37+
>AfterObject : typeof AfterObject
38+
>A : AfterObject
39+
40+
};
41+
42+
const enum AfterObject {
43+
>AfterObject : AfterObject
44+
45+
A = 2,
46+
>A : AfterObject.A
47+
>2 : 2
48+
}
49+
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts(2,12): error TS2450: Enum 'E' used before its declaration.
2+
blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts(7,12): error TS2450: Enum 'E' used before its declaration.
3+
blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts(12,8): error TS2450: Enum 'AfterObject' used before its declaration.
4+
5+
6+
==== blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts (3 errors) ====
7+
function foo1() {
8+
return E.A
9+
~
10+
!!! error TS2450: Enum 'E' used before its declaration.
11+
!!! related TS2728 blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts:3:10: 'E' is declared here.
12+
enum E { A }
13+
}
14+
15+
function foo2() {
16+
return E.A
17+
~
18+
!!! error TS2450: Enum 'E' used before its declaration.
19+
!!! related TS2728 blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts:8:16: 'E' is declared here.
20+
const enum E { A }
21+
}
22+
23+
const config = {
24+
a: AfterObject.A,
25+
~~~~~~~~~~~
26+
!!! error TS2450: Enum 'AfterObject' used before its declaration.
27+
!!! related TS2728 blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts:15:12: 'AfterObject' is declared here.
28+
};
29+
30+
const enum AfterObject {
31+
A = 2,
32+
}
33+
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
//// [tests/cases/compiler/blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts] ////
2+
3+
//// [blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts]
4+
function foo1() {
5+
return E.A
6+
enum E { A }
7+
}
8+
9+
function foo2() {
10+
return E.A
11+
const enum E { A }
12+
}
13+
14+
const config = {
15+
a: AfterObject.A,
16+
};
17+
18+
const enum AfterObject {
19+
A = 2,
20+
}
21+
22+
23+
//// [blockScopedEnumVariablesUseBeforeDef_isolatedModules.js]
24+
function foo1() {
25+
return E.A;
26+
var E;
27+
(function (E) {
28+
E[E["A"] = 0] = "A";
29+
})(E || (E = {}));
30+
}
31+
function foo2() {
32+
return E.A;
33+
var E;
34+
(function (E) {
35+
E[E["A"] = 0] = "A";
36+
})(E || (E = {}));
37+
}
38+
var config = {
39+
a: AfterObject.A,
40+
};
41+
var AfterObject;
42+
(function (AfterObject) {
43+
AfterObject[AfterObject["A"] = 2] = "A";
44+
})(AfterObject || (AfterObject = {}));
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
//// [tests/cases/compiler/blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts] ////
2+
3+
=== blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts ===
4+
function foo1() {
5+
>foo1 : Symbol(foo1, Decl(blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts, 0, 0))
6+
7+
return E.A
8+
>E.A : Symbol(E.A, Decl(blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts, 2, 12))
9+
>E : Symbol(E, Decl(blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts, 1, 14))
10+
>A : Symbol(E.A, Decl(blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts, 2, 12))
11+
12+
enum E { A }
13+
>E : Symbol(E, Decl(blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts, 1, 14))
14+
>A : Symbol(E.A, Decl(blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts, 2, 12))
15+
}
16+
17+
function foo2() {
18+
>foo2 : Symbol(foo2, Decl(blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts, 3, 1))
19+
20+
return E.A
21+
>E.A : Symbol(E.A, Decl(blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts, 7, 18))
22+
>E : Symbol(E, Decl(blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts, 6, 14))
23+
>A : Symbol(E.A, Decl(blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts, 7, 18))
24+
25+
const enum E { A }
26+
>E : Symbol(E, Decl(blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts, 6, 14))
27+
>A : Symbol(E.A, Decl(blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts, 7, 18))
28+
}
29+
30+
const config = {
31+
>config : Symbol(config, Decl(blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts, 10, 5))
32+
33+
a: AfterObject.A,
34+
>a : Symbol(a, Decl(blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts, 10, 16))
35+
>AfterObject.A : Symbol(AfterObject.A, Decl(blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts, 14, 24))
36+
>AfterObject : Symbol(AfterObject, Decl(blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts, 12, 2))
37+
>A : Symbol(AfterObject.A, Decl(blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts, 14, 24))
38+
39+
};
40+
41+
const enum AfterObject {
42+
>AfterObject : Symbol(AfterObject, Decl(blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts, 12, 2))
43+
44+
A = 2,
45+
>A : Symbol(AfterObject.A, Decl(blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts, 14, 24))
46+
}
47+
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
//// [tests/cases/compiler/blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts] ////
2+
3+
=== blockScopedEnumVariablesUseBeforeDef_isolatedModules.ts ===
4+
function foo1() {
5+
>foo1 : () => E
6+
7+
return E.A
8+
>E.A : E
9+
>E : typeof E
10+
>A : E
11+
12+
enum E { A }
13+
>E : E
14+
>A : E.A
15+
}
16+
17+
function foo2() {
18+
>foo2 : () => E
19+
20+
return E.A
21+
>E.A : E
22+
>E : typeof E
23+
>A : E
24+
25+
const enum E { A }
26+
>E : E
27+
>A : E.A
28+
}
29+
30+
const config = {
31+
>config : { a: AfterObject; }
32+
>{ a: AfterObject.A,} : { a: AfterObject; }
33+
34+
a: AfterObject.A,
35+
>a : AfterObject
36+
>AfterObject.A : AfterObject
37+
>AfterObject : typeof AfterObject
38+
>A : AfterObject
39+
40+
};
41+
42+
const enum AfterObject {
43+
>AfterObject : AfterObject
44+
45+
A = 2,
46+
>A : AfterObject.A
47+
>2 : 2
48+
}
49+
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
blockScopedEnumVariablesUseBeforeDef_verbatimModuleSyntax.ts(2,12): error TS2450: Enum 'E' used before its declaration.
2+
blockScopedEnumVariablesUseBeforeDef_verbatimModuleSyntax.ts(7,12): error TS2450: Enum 'E' used before its declaration.
3+
blockScopedEnumVariablesUseBeforeDef_verbatimModuleSyntax.ts(12,8): error TS2450: Enum 'AfterObject' used before its declaration.
4+
5+
6+
==== blockScopedEnumVariablesUseBeforeDef_verbatimModuleSyntax.ts (3 errors) ====
7+
function foo1() {
8+
return E.A
9+
~
10+
!!! error TS2450: Enum 'E' used before its declaration.
11+
!!! related TS2728 blockScopedEnumVariablesUseBeforeDef_verbatimModuleSyntax.ts:3:10: 'E' is declared here.
12+
enum E { A }
13+
}
14+
15+
function foo2() {
16+
return E.A
17+
~
18+
!!! error TS2450: Enum 'E' used before its declaration.
19+
!!! related TS2728 blockScopedEnumVariablesUseBeforeDef_verbatimModuleSyntax.ts:8:16: 'E' is declared here.
20+
const enum E { A }
21+
}
22+
23+
const config = {
24+
a: AfterObject.A,
25+
~~~~~~~~~~~
26+
!!! error TS2450: Enum 'AfterObject' used before its declaration.
27+
!!! related TS2728 blockScopedEnumVariablesUseBeforeDef_verbatimModuleSyntax.ts:15:12: 'AfterObject' is declared here.
28+
};
29+
30+
const enum AfterObject {
31+
A = 2,
32+
}
33+

0 commit comments

Comments
 (0)