Reset constEnumOnlyModule flag on relevant symbol merges in binder (#29079)

This commit is contained in:
Wesley Wigham 2018-12-18 12:31:53 -08:00 committed by GitHub
parent 3edd2d6893
commit 4e3bc9e35a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 126 additions and 0 deletions

View File

@ -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);
}

View File

@ -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");

View File

@ -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))

View File

@ -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"

View File

@ -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");