Skip to content

Commit 89fda5c

Browse files
authored
Fix enum const initializer visibility painting (#28415)
1 parent b534fb4 commit 89fda5c

File tree

8 files changed

+96
-7
lines changed

8 files changed

+96
-7
lines changed

src/compiler/checker.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28799,15 +28799,15 @@ namespace ts {
2879928799
return false;
2880028800
}
2880128801

28802-
function literalTypeToNode(type: FreshableType, enclosing: Node): Expression {
28803-
const enumResult = type.flags & TypeFlags.EnumLiteral ? nodeBuilder.symbolToExpression(type.symbol, SymbolFlags.Value, enclosing)
28802+
function literalTypeToNode(type: FreshableType, enclosing: Node, tracker: SymbolTracker): Expression {
28803+
const enumResult = type.flags & TypeFlags.EnumLiteral ? nodeBuilder.symbolToExpression(type.symbol, SymbolFlags.Value, enclosing, /*flags*/ undefined, tracker)
2880428804
: type === trueType ? createTrue() : type === falseType && createFalse();
2880528805
return enumResult || createLiteral((type as LiteralType).value);
2880628806
}
2880728807

28808-
function createLiteralConstValue(node: VariableDeclaration | PropertyDeclaration | PropertySignature | ParameterDeclaration) {
28808+
function createLiteralConstValue(node: VariableDeclaration | PropertyDeclaration | PropertySignature | ParameterDeclaration, tracker: SymbolTracker) {
2880928809
const type = getTypeOfSymbol(getSymbolOfNode(node));
28810-
return literalTypeToNode(<FreshableType>type, node);
28810+
return literalTypeToNode(<FreshableType>type, node, tracker);
2881128811
}
2881228812

2881328813
function createResolver(): EmitResolver {

src/compiler/transformers/declarations.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ namespace ts {
373373

374374
function ensureNoInitializer(node: CanHaveLiteralInitializer) {
375375
if (shouldPrintWithInitializer(node)) {
376-
return resolver.createLiteralConstValue(getParseTreeNode(node) as CanHaveLiteralInitializer); // TODO: Make safe
376+
return resolver.createLiteralConstValue(getParseTreeNode(node) as CanHaveLiteralInitializer, symbolTracker); // TODO: Make safe
377377
}
378378
return undefined;
379379
}

src/compiler/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3500,7 +3500,7 @@ namespace ts {
35003500
createTypeOfDeclaration(declaration: AccessorDeclaration | VariableLikeDeclaration | PropertyAccessExpression, enclosingDeclaration: Node, flags: NodeBuilderFlags, tracker: SymbolTracker, addUndefined?: boolean): TypeNode | undefined;
35013501
createReturnTypeOfSignatureDeclaration(signatureDeclaration: SignatureDeclaration, enclosingDeclaration: Node, flags: NodeBuilderFlags, tracker: SymbolTracker): TypeNode | undefined;
35023502
createTypeOfExpression(expr: Expression, enclosingDeclaration: Node, flags: NodeBuilderFlags, tracker: SymbolTracker): TypeNode | undefined;
3503-
createLiteralConstValue(node: VariableDeclaration | PropertyDeclaration | PropertySignature | ParameterDeclaration): Expression;
3503+
createLiteralConstValue(node: VariableDeclaration | PropertyDeclaration | PropertySignature | ParameterDeclaration, tracker: SymbolTracker): Expression;
35043504
isSymbolAccessible(symbol: Symbol, enclosingDeclaration: Node | undefined, meaning: SymbolFlags | undefined, shouldComputeAliasToMarkVisible: boolean): SymbolAccessibilityResult;
35053505
isEntityNameVisible(entityName: EntityNameOrEntityNameExpression, enclosingDeclaration: Node): SymbolVisibilityResult;
35063506
// Returns the constant value this property access resolves to, or 'undefined' for a non-constant
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//// [tests/cases/compiler/enumDeclarationEmitInitializerHasImport.ts] ////
2+
3+
//// [provider.ts]
4+
export enum Enum {
5+
Value1,
6+
Value2,
7+
}
8+
//// [consumer.ts]
9+
import provider = require('./provider');
10+
11+
export const value = provider.Enum.Value1;
12+
13+
//// [provider.js]
14+
"use strict";
15+
exports.__esModule = true;
16+
var Enum;
17+
(function (Enum) {
18+
Enum[Enum["Value1"] = 0] = "Value1";
19+
Enum[Enum["Value2"] = 1] = "Value2";
20+
})(Enum = exports.Enum || (exports.Enum = {}));
21+
//// [consumer.js]
22+
"use strict";
23+
exports.__esModule = true;
24+
var provider = require("./provider");
25+
exports.value = provider.Enum.Value1;
26+
27+
28+
//// [provider.d.ts]
29+
export declare enum Enum {
30+
Value1 = 0,
31+
Value2 = 1
32+
}
33+
//// [consumer.d.ts]
34+
import provider = require('./provider');
35+
export declare const value = provider.Enum.Value1;
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
=== tests/cases/compiler/consumer.ts ===
2+
import provider = require('./provider');
3+
>provider : Symbol(provider, Decl(consumer.ts, 0, 0))
4+
5+
export const value = provider.Enum.Value1;
6+
>value : Symbol(value, Decl(consumer.ts, 2, 12))
7+
>provider.Enum.Value1 : Symbol(provider.Enum.Value1, Decl(provider.ts, 0, 18))
8+
>provider.Enum : Symbol(provider.Enum, Decl(provider.ts, 0, 0))
9+
>provider : Symbol(provider, Decl(consumer.ts, 0, 0))
10+
>Enum : Symbol(provider.Enum, Decl(provider.ts, 0, 0))
11+
>Value1 : Symbol(provider.Enum.Value1, Decl(provider.ts, 0, 18))
12+
13+
=== tests/cases/compiler/provider.ts ===
14+
export enum Enum {
15+
>Enum : Symbol(Enum, Decl(provider.ts, 0, 0))
16+
17+
Value1,
18+
>Value1 : Symbol(Enum.Value1, Decl(provider.ts, 0, 18))
19+
20+
Value2,
21+
>Value2 : Symbol(Enum.Value2, Decl(provider.ts, 1, 11))
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
=== tests/cases/compiler/consumer.ts ===
2+
import provider = require('./provider');
3+
>provider : typeof provider
4+
5+
export const value = provider.Enum.Value1;
6+
>value : provider.Enum.Value1
7+
>provider.Enum.Value1 : provider.Enum.Value1
8+
>provider.Enum : typeof provider.Enum
9+
>provider : typeof provider
10+
>Enum : typeof provider.Enum
11+
>Value1 : provider.Enum.Value1
12+
13+
=== tests/cases/compiler/provider.ts ===
14+
export enum Enum {
15+
>Enum : Enum
16+
17+
Value1,
18+
>Value1 : Enum.Value1
19+
20+
Value2,
21+
>Value2 : Enum.Value2
22+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// @declaration: true
2+
// @filename: provider.ts
3+
export enum Enum {
4+
Value1,
5+
Value2,
6+
}
7+
// @filename: consumer.ts
8+
import provider = require('./provider');
9+
10+
export const value = provider.Enum.Value1;

0 commit comments

Comments
 (0)