Skip to content

Commit d81a976

Browse files
authored
Ensure enum aliases referenced in other enum members do not get marked as referenced (microsoft#48770)
* Add test * Ensure enum aliases referenced in other enum members do not get marked as referenced
1 parent 2e619fd commit d81a976

File tree

5 files changed

+121
-2
lines changed

5 files changed

+121
-2
lines changed

src/compiler/checker.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28946,10 +28946,17 @@ namespace ts {
2894628946
prop = getPropertyOfType(apparentType, right.escapedText);
2894728947
}
2894828948
// In `Foo.Bar.Baz`, 'Foo' is not referenced if 'Bar' is a const enum or a module containing only const enums.
28949+
// `Foo` is also not referenced in `enum FooCopy { Bar = Foo.Bar }`, because the enum member value gets inlined
28950+
// here even if `Foo` is not a const enum.
28951+
//
2894928952
// The exceptions are:
2895028953
// 1. if 'isolatedModules' is enabled, because the const enum value will not be inlined, and
2895128954
// 2. if 'preserveConstEnums' is enabled and the expression is itself an export, e.g. `export = Foo.Bar.Baz`.
28952-
if (isIdentifier(left) && parentSymbol && (compilerOptions.isolatedModules || !(prop && isConstEnumOrConstEnumOnlyModule(prop)) || shouldPreserveConstEnums(compilerOptions) && isExportOrExportExpression(node))) {
28955+
if (isIdentifier(left) && parentSymbol && (
28956+
compilerOptions.isolatedModules ||
28957+
!(prop && (isConstEnumOrConstEnumOnlyModule(prop) || prop.flags & SymbolFlags.EnumMember && node.parent.kind === SyntaxKind.EnumMember)) ||
28958+
shouldPreserveConstEnums(compilerOptions) && isExportOrExportExpression(node)
28959+
)) {
2895328960
markAliasReferenced(parentSymbol, node);
2895428961
}
2895528962

@@ -40224,7 +40231,7 @@ namespace ts {
4022440231

4022540232
function isConstantMemberAccess(node: Expression): node is AccessExpression {
4022640233
const type = getTypeOfExpression(node);
40227-
if(type === errorType) {
40234+
if (type === errorType) {
4022840235
return false;
4022940236
}
4023040237

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//// [tests/cases/compiler/importElisionEnum.ts] ////
2+
3+
//// [enum.ts]
4+
export enum MyEnum {
5+
a = 0,
6+
b,
7+
c,
8+
d
9+
}
10+
11+
//// [index.ts]
12+
import { MyEnum as MyEnumFromModule } from "./enum";
13+
14+
enum MyEnum {
15+
a = MyEnumFromModule.a
16+
}
17+
18+
//// [enum.js]
19+
"use strict";
20+
exports.__esModule = true;
21+
exports.MyEnum = void 0;
22+
var MyEnum;
23+
(function (MyEnum) {
24+
MyEnum[MyEnum["a"] = 0] = "a";
25+
MyEnum[MyEnum["b"] = 1] = "b";
26+
MyEnum[MyEnum["c"] = 2] = "c";
27+
MyEnum[MyEnum["d"] = 3] = "d";
28+
})(MyEnum = exports.MyEnum || (exports.MyEnum = {}));
29+
//// [index.js]
30+
"use strict";
31+
exports.__esModule = true;
32+
var MyEnum;
33+
(function (MyEnum) {
34+
MyEnum[MyEnum["a"] = 0] = "a";
35+
})(MyEnum || (MyEnum = {}));
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
=== tests/cases/compiler/enum.ts ===
2+
export enum MyEnum {
3+
>MyEnum : Symbol(MyEnum, Decl(enum.ts, 0, 0))
4+
5+
a = 0,
6+
>a : Symbol(MyEnum.a, Decl(enum.ts, 0, 20))
7+
8+
b,
9+
>b : Symbol(MyEnum.b, Decl(enum.ts, 1, 8))
10+
11+
c,
12+
>c : Symbol(MyEnum.c, Decl(enum.ts, 2, 4))
13+
14+
d
15+
>d : Symbol(MyEnum.d, Decl(enum.ts, 3, 4))
16+
}
17+
18+
=== tests/cases/compiler/index.ts ===
19+
import { MyEnum as MyEnumFromModule } from "./enum";
20+
>MyEnum : Symbol(MyEnumFromModule, Decl(enum.ts, 0, 0))
21+
>MyEnumFromModule : Symbol(MyEnumFromModule, Decl(index.ts, 0, 8))
22+
23+
enum MyEnum {
24+
>MyEnum : Symbol(MyEnum, Decl(index.ts, 0, 52))
25+
26+
a = MyEnumFromModule.a
27+
>a : Symbol(MyEnum.a, Decl(index.ts, 2, 13))
28+
>MyEnumFromModule.a : Symbol(MyEnumFromModule.a, Decl(enum.ts, 0, 20))
29+
>MyEnumFromModule : Symbol(MyEnumFromModule, Decl(index.ts, 0, 8))
30+
>a : Symbol(MyEnumFromModule.a, Decl(enum.ts, 0, 20))
31+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
=== tests/cases/compiler/enum.ts ===
2+
export enum MyEnum {
3+
>MyEnum : MyEnum
4+
5+
a = 0,
6+
>a : MyEnum.a
7+
>0 : 0
8+
9+
b,
10+
>b : MyEnum.b
11+
12+
c,
13+
>c : MyEnum.c
14+
15+
d
16+
>d : MyEnum.d
17+
}
18+
19+
=== tests/cases/compiler/index.ts ===
20+
import { MyEnum as MyEnumFromModule } from "./enum";
21+
>MyEnum : typeof MyEnumFromModule
22+
>MyEnumFromModule : typeof MyEnumFromModule
23+
24+
enum MyEnum {
25+
>MyEnum : MyEnum
26+
27+
a = MyEnumFromModule.a
28+
>a : MyEnum
29+
>MyEnumFromModule.a : MyEnumFromModule.a
30+
>MyEnumFromModule : typeof MyEnumFromModule
31+
>a : MyEnumFromModule.a
32+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// @Filename: enum.ts
2+
export enum MyEnum {
3+
a = 0,
4+
b,
5+
c,
6+
d
7+
}
8+
9+
// @Filename: index.ts
10+
import { MyEnum as MyEnumFromModule } from "./enum";
11+
12+
enum MyEnum {
13+
a = MyEnumFromModule.a
14+
}

0 commit comments

Comments
 (0)