diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 21bc30cfdc8..7216af4e817 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -233,6 +233,11 @@ namespace ts { symbol.members = createSymbolTable(); } + // On merge of const enum module with class or function, reset const enum only flag (namespaces will already recalculate) + if (symbol.constEnumOnlyModule && (symbol.flags & (SymbolFlags.Function | SymbolFlags.Class | SymbolFlags.RegularEnum))) { + symbol.constEnumOnlyModule = false; + } + if (symbolFlags & SymbolFlags.Value) { setValueDeclaration(symbol, node); } diff --git a/tests/baselines/reference/emitClassMergedWithConstNamespaceNotElided.js b/tests/baselines/reference/emitClassMergedWithConstNamespaceNotElided.js new file mode 100644 index 00000000000..953f5c1508d --- /dev/null +++ b/tests/baselines/reference/emitClassMergedWithConstNamespaceNotElided.js @@ -0,0 +1,25 @@ +//// [tests/cases/compiler/emitClassMergedWithConstNamespaceNotElided.ts] //// + +//// [enum.d.ts] +export namespace Clone { + const enum LOCAL { + AUTO = 0, + LOCAL = 1, + NO_LOCAL = 2, + NO_LINKS = 3 + } +} + +export class Clone { + static clone(url: string): void; +} +//// [usage.ts] +import {Clone} from "./enum"; + +Clone.clone("ok"); + +//// [usage.js] +"use strict"; +exports.__esModule = true; +var enum_1 = require("./enum"); +enum_1.Clone.clone("ok"); diff --git a/tests/baselines/reference/emitClassMergedWithConstNamespaceNotElided.symbols b/tests/baselines/reference/emitClassMergedWithConstNamespaceNotElided.symbols new file mode 100644 index 00000000000..a6a624d5e61 --- /dev/null +++ b/tests/baselines/reference/emitClassMergedWithConstNamespaceNotElided.symbols @@ -0,0 +1,37 @@ +=== tests/cases/compiler/enum.d.ts === +export namespace Clone { +>Clone : Symbol(Clone, Decl(enum.d.ts, 0, 0), Decl(enum.d.ts, 7, 1)) + + const enum LOCAL { +>LOCAL : Symbol(LOCAL, Decl(enum.d.ts, 0, 24)) + + AUTO = 0, +>AUTO : Symbol(LOCAL.AUTO, Decl(enum.d.ts, 1, 22)) + + LOCAL = 1, +>LOCAL : Symbol(LOCAL.LOCAL, Decl(enum.d.ts, 2, 17)) + + NO_LOCAL = 2, +>NO_LOCAL : Symbol(LOCAL.NO_LOCAL, Decl(enum.d.ts, 3, 18)) + + NO_LINKS = 3 +>NO_LINKS : Symbol(LOCAL.NO_LINKS, Decl(enum.d.ts, 4, 21)) + } +} + +export class Clone { +>Clone : Symbol(Clone, Decl(enum.d.ts, 0, 0), Decl(enum.d.ts, 7, 1)) + + static clone(url: string): void; +>clone : Symbol(Clone.clone, Decl(enum.d.ts, 9, 20)) +>url : Symbol(url, Decl(enum.d.ts, 10, 17)) +} +=== tests/cases/compiler/usage.ts === +import {Clone} from "./enum"; +>Clone : Symbol(Clone, Decl(usage.ts, 0, 8)) + +Clone.clone("ok"); +>Clone.clone : Symbol(Clone.clone, Decl(enum.d.ts, 9, 20)) +>Clone : Symbol(Clone, Decl(usage.ts, 0, 8)) +>clone : Symbol(Clone.clone, Decl(enum.d.ts, 9, 20)) + diff --git a/tests/baselines/reference/emitClassMergedWithConstNamespaceNotElided.types b/tests/baselines/reference/emitClassMergedWithConstNamespaceNotElided.types new file mode 100644 index 00000000000..582c128d608 --- /dev/null +++ b/tests/baselines/reference/emitClassMergedWithConstNamespaceNotElided.types @@ -0,0 +1,41 @@ +=== tests/cases/compiler/enum.d.ts === +export namespace Clone { + const enum LOCAL { +>LOCAL : LOCAL + + AUTO = 0, +>AUTO : LOCAL.AUTO +>0 : 0 + + LOCAL = 1, +>LOCAL : LOCAL.LOCAL +>1 : 1 + + NO_LOCAL = 2, +>NO_LOCAL : LOCAL.NO_LOCAL +>2 : 2 + + NO_LINKS = 3 +>NO_LINKS : LOCAL.NO_LINKS +>3 : 3 + } +} + +export class Clone { +>Clone : Clone + + static clone(url: string): void; +>clone : (url: string) => void +>url : string +} +=== tests/cases/compiler/usage.ts === +import {Clone} from "./enum"; +>Clone : typeof Clone + +Clone.clone("ok"); +>Clone.clone("ok") : void +>Clone.clone : (url: string) => void +>Clone : typeof Clone +>clone : (url: string) => void +>"ok" : "ok" + diff --git a/tests/cases/compiler/emitClassMergedWithConstNamespaceNotElided.ts b/tests/cases/compiler/emitClassMergedWithConstNamespaceNotElided.ts new file mode 100644 index 00000000000..e34dcc33463 --- /dev/null +++ b/tests/cases/compiler/emitClassMergedWithConstNamespaceNotElided.ts @@ -0,0 +1,18 @@ +// @esModuleInterop: true +// @filename: enum.d.ts +export namespace Clone { + const enum LOCAL { + AUTO = 0, + LOCAL = 1, + NO_LOCAL = 2, + NO_LINKS = 3 + } +} + +export class Clone { + static clone(url: string): void; +} +// @filename: usage.ts +import {Clone} from "./enum"; + +Clone.clone("ok"); \ No newline at end of file