Skip to content

Commit 7743d20

Browse files
committed
Merge pull request #5193 from Microsoft/namespace-before-ambient-derived-class-finds-heritage
Namespace before ambient derived class finds heritage
2 parents 3d6312a + 57f7d7f commit 7743d20

6 files changed

+162
-11
lines changed

src/compiler/binder.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,9 +175,14 @@ namespace ts {
175175
symbol.members = {};
176176
}
177177

178-
if (symbolFlags & SymbolFlags.Value && !symbol.valueDeclaration) {
179-
symbol.valueDeclaration = node;
180-
}
178+
if (symbolFlags & SymbolFlags.Value) {
179+
const valueDeclaration = symbol.valueDeclaration;
180+
if (!valueDeclaration ||
181+
(valueDeclaration.kind !== node.kind && valueDeclaration.kind === SyntaxKind.ModuleDeclaration)) {
182+
// other kinds of value declarations take precedence over modules
183+
symbol.valueDeclaration = node;
184+
}
185+
}
181186
}
182187

183188
// Should not be called on a declaration with a computed property name,

src/compiler/checker.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,12 @@ namespace ts {
295295
target.constEnumOnlyModule = false;
296296
}
297297
target.flags |= source.flags;
298-
if (!target.valueDeclaration && source.valueDeclaration) target.valueDeclaration = source.valueDeclaration;
298+
if (source.valueDeclaration &&
299+
(!target.valueDeclaration ||
300+
(target.valueDeclaration.kind === SyntaxKind.ModuleDeclaration && source.valueDeclaration.kind !== SyntaxKind.ModuleDeclaration))) {
301+
// other kinds of value declarations take precedence over modules
302+
target.valueDeclaration = source.valueDeclaration;
303+
}
299304
forEach(source.declarations, node => {
300305
target.declarations.push(node);
301306
});
Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,40 @@
1-
//// [ambientClassDeclarationWithExtends.ts]
1+
//// [tests/cases/compiler/ambientClassDeclarationWithExtends.ts] ////
2+
3+
//// [ambientClassDeclarationExtends_singleFile.ts]
24
declare class A { }
35
declare class B extends A { }
6+
7+
declare class C {
8+
public foo;
9+
}
10+
namespace D { var x; }
11+
declare class D extends C { }
12+
13+
var d: C = new D();
14+
15+
//// [ambientClassDeclarationExtends_file1.ts]
16+
17+
declare class E {
18+
public bar;
19+
}
20+
namespace F { var y; }
21+
22+
//// [ambientClassDeclarationExtends_file2.ts]
23+
24+
declare class F extends E { }
25+
var f: E = new F();
426

527

6-
//// [ambientClassDeclarationWithExtends.js]
28+
//// [ambientClassDeclarationExtends_singleFile.js]
29+
var D;
30+
(function (D) {
31+
var x;
32+
})(D || (D = {}));
33+
var d = new D();
34+
//// [ambientClassDeclarationExtends_file1.js]
35+
var F;
36+
(function (F) {
37+
var y;
38+
})(F || (F = {}));
39+
//// [ambientClassDeclarationExtends_file2.js]
40+
var f = new F();
Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,50 @@
1-
=== tests/cases/compiler/ambientClassDeclarationWithExtends.ts ===
1+
=== tests/cases/compiler/ambientClassDeclarationExtends_singleFile.ts ===
22
declare class A { }
3-
>A : Symbol(A, Decl(ambientClassDeclarationWithExtends.ts, 0, 0))
3+
>A : Symbol(A, Decl(ambientClassDeclarationExtends_singleFile.ts, 0, 0))
44

55
declare class B extends A { }
6-
>B : Symbol(B, Decl(ambientClassDeclarationWithExtends.ts, 0, 19))
7-
>A : Symbol(A, Decl(ambientClassDeclarationWithExtends.ts, 0, 0))
6+
>B : Symbol(B, Decl(ambientClassDeclarationExtends_singleFile.ts, 0, 19))
7+
>A : Symbol(A, Decl(ambientClassDeclarationExtends_singleFile.ts, 0, 0))
8+
9+
declare class C {
10+
>C : Symbol(C, Decl(ambientClassDeclarationExtends_singleFile.ts, 1, 29))
11+
12+
public foo;
13+
>foo : Symbol(foo, Decl(ambientClassDeclarationExtends_singleFile.ts, 3, 17))
14+
}
15+
namespace D { var x; }
16+
>D : Symbol(D, Decl(ambientClassDeclarationExtends_singleFile.ts, 5, 1), Decl(ambientClassDeclarationExtends_singleFile.ts, 6, 22))
17+
>x : Symbol(x, Decl(ambientClassDeclarationExtends_singleFile.ts, 6, 17))
18+
19+
declare class D extends C { }
20+
>D : Symbol(D, Decl(ambientClassDeclarationExtends_singleFile.ts, 5, 1), Decl(ambientClassDeclarationExtends_singleFile.ts, 6, 22))
21+
>C : Symbol(C, Decl(ambientClassDeclarationExtends_singleFile.ts, 1, 29))
22+
23+
var d: C = new D();
24+
>d : Symbol(d, Decl(ambientClassDeclarationExtends_singleFile.ts, 9, 3))
25+
>C : Symbol(C, Decl(ambientClassDeclarationExtends_singleFile.ts, 1, 29))
26+
>D : Symbol(D, Decl(ambientClassDeclarationExtends_singleFile.ts, 5, 1), Decl(ambientClassDeclarationExtends_singleFile.ts, 6, 22))
27+
28+
=== tests/cases/compiler/ambientClassDeclarationExtends_file1.ts ===
29+
30+
declare class E {
31+
>E : Symbol(E, Decl(ambientClassDeclarationExtends_file1.ts, 0, 0))
32+
33+
public bar;
34+
>bar : Symbol(bar, Decl(ambientClassDeclarationExtends_file1.ts, 1, 17))
35+
}
36+
namespace F { var y; }
37+
>F : Symbol(F, Decl(ambientClassDeclarationExtends_file1.ts, 3, 1), Decl(ambientClassDeclarationExtends_file2.ts, 0, 0))
38+
>y : Symbol(y, Decl(ambientClassDeclarationExtends_file1.ts, 4, 17))
39+
40+
=== tests/cases/compiler/ambientClassDeclarationExtends_file2.ts ===
41+
42+
declare class F extends E { }
43+
>F : Symbol(F, Decl(ambientClassDeclarationExtends_file1.ts, 3, 1), Decl(ambientClassDeclarationExtends_file2.ts, 0, 0))
44+
>E : Symbol(E, Decl(ambientClassDeclarationExtends_file1.ts, 0, 0))
45+
46+
var f: E = new F();
47+
>f : Symbol(f, Decl(ambientClassDeclarationExtends_file2.ts, 2, 3))
48+
>E : Symbol(E, Decl(ambientClassDeclarationExtends_file1.ts, 0, 0))
49+
>F : Symbol(F, Decl(ambientClassDeclarationExtends_file1.ts, 3, 1), Decl(ambientClassDeclarationExtends_file2.ts, 0, 0))
850

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,52 @@
1-
=== tests/cases/compiler/ambientClassDeclarationWithExtends.ts ===
1+
=== tests/cases/compiler/ambientClassDeclarationExtends_singleFile.ts ===
22
declare class A { }
33
>A : A
44

55
declare class B extends A { }
66
>B : B
77
>A : A
88

9+
declare class C {
10+
>C : C
11+
12+
public foo;
13+
>foo : any
14+
}
15+
namespace D { var x; }
16+
>D : typeof D
17+
>x : any
18+
19+
declare class D extends C { }
20+
>D : D
21+
>C : C
22+
23+
var d: C = new D();
24+
>d : C
25+
>C : C
26+
>new D() : D
27+
>D : typeof D
28+
29+
=== tests/cases/compiler/ambientClassDeclarationExtends_file1.ts ===
30+
31+
declare class E {
32+
>E : E
33+
34+
public bar;
35+
>bar : any
36+
}
37+
namespace F { var y; }
38+
>F : typeof F
39+
>y : any
40+
41+
=== tests/cases/compiler/ambientClassDeclarationExtends_file2.ts ===
42+
43+
declare class F extends E { }
44+
>F : F
45+
>E : E
46+
47+
var f: E = new F();
48+
>f : E
49+
>E : E
50+
>new F() : F
51+
>F : typeof F
52+
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,23 @@
1+
// @Filename: ambientClassDeclarationExtends_singleFile.ts
12
declare class A { }
23
declare class B extends A { }
4+
5+
declare class C {
6+
public foo;
7+
}
8+
namespace D { var x; }
9+
declare class D extends C { }
10+
11+
var d: C = new D();
12+
13+
// @Filename: ambientClassDeclarationExtends_file1.ts
14+
15+
declare class E {
16+
public bar;
17+
}
18+
namespace F { var y; }
19+
20+
// @Filename: ambientClassDeclarationExtends_file2.ts
21+
22+
declare class F extends E { }
23+
var f: E = new F();

0 commit comments

Comments
 (0)