Skip to content

Commit 4e3bc9e

Browse files
authored
Reset constEnumOnlyModule flag on relevant symbol merges in binder (#29079)
1 parent 3edd2d6 commit 4e3bc9e

File tree

5 files changed

+126
-0
lines changed

5 files changed

+126
-0
lines changed

src/compiler/binder.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,11 @@ namespace ts {
233233
symbol.members = createSymbolTable();
234234
}
235235

236+
// On merge of const enum module with class or function, reset const enum only flag (namespaces will already recalculate)
237+
if (symbol.constEnumOnlyModule && (symbol.flags & (SymbolFlags.Function | SymbolFlags.Class | SymbolFlags.RegularEnum))) {
238+
symbol.constEnumOnlyModule = false;
239+
}
240+
236241
if (symbolFlags & SymbolFlags.Value) {
237242
setValueDeclaration(symbol, node);
238243
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//// [tests/cases/compiler/emitClassMergedWithConstNamespaceNotElided.ts] ////
2+
3+
//// [enum.d.ts]
4+
export namespace Clone {
5+
const enum LOCAL {
6+
AUTO = 0,
7+
LOCAL = 1,
8+
NO_LOCAL = 2,
9+
NO_LINKS = 3
10+
}
11+
}
12+
13+
export class Clone {
14+
static clone(url: string): void;
15+
}
16+
//// [usage.ts]
17+
import {Clone} from "./enum";
18+
19+
Clone.clone("ok");
20+
21+
//// [usage.js]
22+
"use strict";
23+
exports.__esModule = true;
24+
var enum_1 = require("./enum");
25+
enum_1.Clone.clone("ok");
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
=== tests/cases/compiler/enum.d.ts ===
2+
export namespace Clone {
3+
>Clone : Symbol(Clone, Decl(enum.d.ts, 0, 0), Decl(enum.d.ts, 7, 1))
4+
5+
const enum LOCAL {
6+
>LOCAL : Symbol(LOCAL, Decl(enum.d.ts, 0, 24))
7+
8+
AUTO = 0,
9+
>AUTO : Symbol(LOCAL.AUTO, Decl(enum.d.ts, 1, 22))
10+
11+
LOCAL = 1,
12+
>LOCAL : Symbol(LOCAL.LOCAL, Decl(enum.d.ts, 2, 17))
13+
14+
NO_LOCAL = 2,
15+
>NO_LOCAL : Symbol(LOCAL.NO_LOCAL, Decl(enum.d.ts, 3, 18))
16+
17+
NO_LINKS = 3
18+
>NO_LINKS : Symbol(LOCAL.NO_LINKS, Decl(enum.d.ts, 4, 21))
19+
}
20+
}
21+
22+
export class Clone {
23+
>Clone : Symbol(Clone, Decl(enum.d.ts, 0, 0), Decl(enum.d.ts, 7, 1))
24+
25+
static clone(url: string): void;
26+
>clone : Symbol(Clone.clone, Decl(enum.d.ts, 9, 20))
27+
>url : Symbol(url, Decl(enum.d.ts, 10, 17))
28+
}
29+
=== tests/cases/compiler/usage.ts ===
30+
import {Clone} from "./enum";
31+
>Clone : Symbol(Clone, Decl(usage.ts, 0, 8))
32+
33+
Clone.clone("ok");
34+
>Clone.clone : Symbol(Clone.clone, Decl(enum.d.ts, 9, 20))
35+
>Clone : Symbol(Clone, Decl(usage.ts, 0, 8))
36+
>clone : Symbol(Clone.clone, Decl(enum.d.ts, 9, 20))
37+
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
=== tests/cases/compiler/enum.d.ts ===
2+
export namespace Clone {
3+
const enum LOCAL {
4+
>LOCAL : LOCAL
5+
6+
AUTO = 0,
7+
>AUTO : LOCAL.AUTO
8+
>0 : 0
9+
10+
LOCAL = 1,
11+
>LOCAL : LOCAL.LOCAL
12+
>1 : 1
13+
14+
NO_LOCAL = 2,
15+
>NO_LOCAL : LOCAL.NO_LOCAL
16+
>2 : 2
17+
18+
NO_LINKS = 3
19+
>NO_LINKS : LOCAL.NO_LINKS
20+
>3 : 3
21+
}
22+
}
23+
24+
export class Clone {
25+
>Clone : Clone
26+
27+
static clone(url: string): void;
28+
>clone : (url: string) => void
29+
>url : string
30+
}
31+
=== tests/cases/compiler/usage.ts ===
32+
import {Clone} from "./enum";
33+
>Clone : typeof Clone
34+
35+
Clone.clone("ok");
36+
>Clone.clone("ok") : void
37+
>Clone.clone : (url: string) => void
38+
>Clone : typeof Clone
39+
>clone : (url: string) => void
40+
>"ok" : "ok"
41+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// @esModuleInterop: true
2+
// @filename: enum.d.ts
3+
export namespace Clone {
4+
const enum LOCAL {
5+
AUTO = 0,
6+
LOCAL = 1,
7+
NO_LOCAL = 2,
8+
NO_LINKS = 3
9+
}
10+
}
11+
12+
export class Clone {
13+
static clone(url: string): void;
14+
}
15+
// @filename: usage.ts
16+
import {Clone} from "./enum";
17+
18+
Clone.clone("ok");

0 commit comments

Comments
 (0)