diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 23ccfe95c48..103200600b2 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -28799,15 +28799,15 @@ namespace ts { return false; } - function literalTypeToNode(type: FreshableType, enclosing: Node): Expression { - const enumResult = type.flags & TypeFlags.EnumLiteral ? nodeBuilder.symbolToExpression(type.symbol, SymbolFlags.Value, enclosing) + function literalTypeToNode(type: FreshableType, enclosing: Node, tracker: SymbolTracker): Expression { + const enumResult = type.flags & TypeFlags.EnumLiteral ? nodeBuilder.symbolToExpression(type.symbol, SymbolFlags.Value, enclosing, /*flags*/ undefined, tracker) : type === trueType ? createTrue() : type === falseType && createFalse(); return enumResult || createLiteral((type as LiteralType).value); } - function createLiteralConstValue(node: VariableDeclaration | PropertyDeclaration | PropertySignature | ParameterDeclaration) { + function createLiteralConstValue(node: VariableDeclaration | PropertyDeclaration | PropertySignature | ParameterDeclaration, tracker: SymbolTracker) { const type = getTypeOfSymbol(getSymbolOfNode(node)); - return literalTypeToNode(type, node); + return literalTypeToNode(type, node, tracker); } function createResolver(): EmitResolver { diff --git a/src/compiler/transformers/declarations.ts b/src/compiler/transformers/declarations.ts index 9ccca4732e8..968b61198a6 100644 --- a/src/compiler/transformers/declarations.ts +++ b/src/compiler/transformers/declarations.ts @@ -373,7 +373,7 @@ namespace ts { function ensureNoInitializer(node: CanHaveLiteralInitializer) { if (shouldPrintWithInitializer(node)) { - return resolver.createLiteralConstValue(getParseTreeNode(node) as CanHaveLiteralInitializer); // TODO: Make safe + return resolver.createLiteralConstValue(getParseTreeNode(node) as CanHaveLiteralInitializer, symbolTracker); // TODO: Make safe } return undefined; } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 16947eea195..0a5e9d9dbd8 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -3500,7 +3500,7 @@ namespace ts { createTypeOfDeclaration(declaration: AccessorDeclaration | VariableLikeDeclaration | PropertyAccessExpression, enclosingDeclaration: Node, flags: NodeBuilderFlags, tracker: SymbolTracker, addUndefined?: boolean): TypeNode | undefined; createReturnTypeOfSignatureDeclaration(signatureDeclaration: SignatureDeclaration, enclosingDeclaration: Node, flags: NodeBuilderFlags, tracker: SymbolTracker): TypeNode | undefined; createTypeOfExpression(expr: Expression, enclosingDeclaration: Node, flags: NodeBuilderFlags, tracker: SymbolTracker): TypeNode | undefined; - createLiteralConstValue(node: VariableDeclaration | PropertyDeclaration | PropertySignature | ParameterDeclaration): Expression; + createLiteralConstValue(node: VariableDeclaration | PropertyDeclaration | PropertySignature | ParameterDeclaration, tracker: SymbolTracker): Expression; isSymbolAccessible(symbol: Symbol, enclosingDeclaration: Node | undefined, meaning: SymbolFlags | undefined, shouldComputeAliasToMarkVisible: boolean): SymbolAccessibilityResult; isEntityNameVisible(entityName: EntityNameOrEntityNameExpression, enclosingDeclaration: Node): SymbolVisibilityResult; // Returns the constant value this property access resolves to, or 'undefined' for a non-constant diff --git a/tests/baselines/reference/enumDeclarationEmitInitializerHasImport.js b/tests/baselines/reference/enumDeclarationEmitInitializerHasImport.js new file mode 100644 index 00000000000..88e52659f93 --- /dev/null +++ b/tests/baselines/reference/enumDeclarationEmitInitializerHasImport.js @@ -0,0 +1,35 @@ +//// [tests/cases/compiler/enumDeclarationEmitInitializerHasImport.ts] //// + +//// [provider.ts] +export enum Enum { + Value1, + Value2, +} +//// [consumer.ts] +import provider = require('./provider'); + +export const value = provider.Enum.Value1; + +//// [provider.js] +"use strict"; +exports.__esModule = true; +var Enum; +(function (Enum) { + Enum[Enum["Value1"] = 0] = "Value1"; + Enum[Enum["Value2"] = 1] = "Value2"; +})(Enum = exports.Enum || (exports.Enum = {})); +//// [consumer.js] +"use strict"; +exports.__esModule = true; +var provider = require("./provider"); +exports.value = provider.Enum.Value1; + + +//// [provider.d.ts] +export declare enum Enum { + Value1 = 0, + Value2 = 1 +} +//// [consumer.d.ts] +import provider = require('./provider'); +export declare const value = provider.Enum.Value1; diff --git a/tests/baselines/reference/enumDeclarationEmitInitializerHasImport.symbols b/tests/baselines/reference/enumDeclarationEmitInitializerHasImport.symbols new file mode 100644 index 00000000000..f101f43ab5b --- /dev/null +++ b/tests/baselines/reference/enumDeclarationEmitInitializerHasImport.symbols @@ -0,0 +1,22 @@ +=== tests/cases/compiler/consumer.ts === +import provider = require('./provider'); +>provider : Symbol(provider, Decl(consumer.ts, 0, 0)) + +export const value = provider.Enum.Value1; +>value : Symbol(value, Decl(consumer.ts, 2, 12)) +>provider.Enum.Value1 : Symbol(provider.Enum.Value1, Decl(provider.ts, 0, 18)) +>provider.Enum : Symbol(provider.Enum, Decl(provider.ts, 0, 0)) +>provider : Symbol(provider, Decl(consumer.ts, 0, 0)) +>Enum : Symbol(provider.Enum, Decl(provider.ts, 0, 0)) +>Value1 : Symbol(provider.Enum.Value1, Decl(provider.ts, 0, 18)) + +=== tests/cases/compiler/provider.ts === +export enum Enum { +>Enum : Symbol(Enum, Decl(provider.ts, 0, 0)) + + Value1, +>Value1 : Symbol(Enum.Value1, Decl(provider.ts, 0, 18)) + + Value2, +>Value2 : Symbol(Enum.Value2, Decl(provider.ts, 1, 11)) +} diff --git a/tests/baselines/reference/enumDeclarationEmitInitializerHasImport.types b/tests/baselines/reference/enumDeclarationEmitInitializerHasImport.types new file mode 100644 index 00000000000..19e6a0c658b --- /dev/null +++ b/tests/baselines/reference/enumDeclarationEmitInitializerHasImport.types @@ -0,0 +1,22 @@ +=== tests/cases/compiler/consumer.ts === +import provider = require('./provider'); +>provider : typeof provider + +export const value = provider.Enum.Value1; +>value : provider.Enum.Value1 +>provider.Enum.Value1 : provider.Enum.Value1 +>provider.Enum : typeof provider.Enum +>provider : typeof provider +>Enum : typeof provider.Enum +>Value1 : provider.Enum.Value1 + +=== tests/cases/compiler/provider.ts === +export enum Enum { +>Enum : Enum + + Value1, +>Value1 : Enum.Value1 + + Value2, +>Value2 : Enum.Value2 +} diff --git a/tests/cases/compiler/enumDeclarationEmitInitializerHasImport.ts b/tests/cases/compiler/enumDeclarationEmitInitializerHasImport.ts new file mode 100644 index 00000000000..2fe022f17b0 --- /dev/null +++ b/tests/cases/compiler/enumDeclarationEmitInitializerHasImport.ts @@ -0,0 +1,10 @@ +// @declaration: true +// @filename: provider.ts +export enum Enum { + Value1, + Value2, +} +// @filename: consumer.ts +import provider = require('./provider'); + +export const value = provider.Enum.Value1; \ No newline at end of file diff --git a/tests/cases/user/TypeScript-Node-Starter/TypeScript-Node-Starter b/tests/cases/user/TypeScript-Node-Starter/TypeScript-Node-Starter index 4779cb7e182..40bdb4eadab 160000 --- a/tests/cases/user/TypeScript-Node-Starter/TypeScript-Node-Starter +++ b/tests/cases/user/TypeScript-Node-Starter/TypeScript-Node-Starter @@ -1 +1 @@ -Subproject commit 4779cb7e182cf41d5c62289bb80d2850e0265b71 +Subproject commit 40bdb4eadabc9fbed7d83e3f26817a931c0763b6