Skip to content

Commit 7acf58b

Browse files
committed
Handel module augmentation with export= var + uninstantiated module
1 parent 01c329c commit 7acf58b

16 files changed

Lines changed: 210 additions & 8 deletions

src/compiler/binder.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -900,7 +900,12 @@ namespace ts {
900900
if (node.flags & NodeFlags.Export) {
901901
errorOnFirstToken(node, Diagnostics.export_modifier_cannot_be_applied_to_ambient_modules_and_module_augmentations_since_they_are_always_visible);
902902
}
903-
declareSymbolAndAddToSymbolTable(node, SymbolFlags.ValueModule, SymbolFlags.ValueModuleExcludes);
903+
if (isExternalModuleAugmentation(node)) {
904+
declareSymbolAndAddToSymbolTable(node, SymbolFlags.NamespaceModule, SymbolFlags.NamespaceModuleExcludes);
905+
}
906+
else {
907+
declareSymbolAndAddToSymbolTable(node, SymbolFlags.ValueModule, SymbolFlags.ValueModuleExcludes);
908+
}
904909
}
905910
else {
906911
const state = getModuleInstanceState(node);

src/compiler/checker.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ namespace ts {
378378

379379
function mergeModuleAugmentation(moduleName: LiteralExpression): void {
380380
const moduleAugmentation = <ModuleDeclaration>moduleName.parent;
381-
if (moduleAugmentation.symbol.valueDeclaration !== moduleAugmentation) {
381+
if (moduleAugmentation.symbol.declarations[0] !== moduleAugmentation) {
382382
// this is a combined symbol for multiple augmentations within the same file.
383383
// its symbol already has accumulated information for all declarations
384384
// so we need to add it just once - do the work only for first declaration
@@ -4498,7 +4498,7 @@ namespace ts {
44984498

44994499
// Get type from reference to class or interface
45004500
function getTypeFromClassOrInterfaceReference(node: TypeReferenceNode | ExpressionWithTypeArguments | JSDocTypeReference, symbol: Symbol): Type {
4501-
const type = <InterfaceType>getDeclaredTypeOfSymbol(symbol);
4501+
const type = <InterfaceType>getDeclaredTypeOfSymbol(getMergedSymbol(symbol));
45024502
const typeParameters = type.localTypeParameters;
45034503
if (typeParameters) {
45044504
if (!node.typeArguments || node.typeArguments.length !== typeParameters.length) {
@@ -14936,7 +14936,7 @@ namespace ts {
1493614936
}
1493714937
else {
1493814938
// symbol should not originate in augmentation
14939-
reportError = isExternalModuleAugmentation(symbol.parent.valueDeclaration);
14939+
reportError = isExternalModuleAugmentation(symbol.parent.declarations[0]);
1494014940
}
1494114941
}
1494214942
if (reportError) {
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
=== tests/cases/compiler/map1.ts ===
2+
3+
import { Observable } from "./observable"
4+
>Observable : Symbol(Observable, Decl(map1.ts, 1, 8))
5+
6+
(<any>Observable.prototype).map = function() { }
7+
>Observable.prototype : Symbol(Observable.prototype)
8+
>Observable : Symbol(Observable, Decl(map1.ts, 1, 8))
9+
>prototype : Symbol(Observable.prototype)
10+
11+
declare module "./observable" {
12+
interface I {x0}
13+
>I : Symbol(I, Decl(map1.ts, 5, 31), Decl(map2.ts, 4, 31))
14+
>x0 : Symbol(x0, Decl(map1.ts, 6, 17))
15+
}
16+
17+
=== tests/cases/compiler/map2.ts ===
18+
import { Observable } from "./observable"
19+
>Observable : Symbol(Observable, Decl(map2.ts, 0, 8))
20+
21+
(<any>Observable.prototype).map = function() { }
22+
>Observable.prototype : Symbol(Observable.prototype)
23+
>Observable : Symbol(Observable, Decl(map2.ts, 0, 8))
24+
>prototype : Symbol(Observable.prototype)
25+
26+
declare module "./observable" {
27+
interface I {x1}
28+
>I : Symbol(I, Decl(map1.ts, 5, 31), Decl(map2.ts, 4, 31))
29+
>x1 : Symbol(x1, Decl(map2.ts, 5, 17))
30+
}
31+
32+
33+
=== tests/cases/compiler/observable.ts ===
34+
export declare class Observable<T> {
35+
>Observable : Symbol(Observable, Decl(observable.ts, 0, 0))
36+
>T : Symbol(T, Decl(observable.ts, 0, 32))
37+
38+
filter(pred: (e:T) => boolean): Observable<T>;
39+
>filter : Symbol(filter, Decl(observable.ts, 0, 36))
40+
>pred : Symbol(pred, Decl(observable.ts, 1, 11))
41+
>e : Symbol(e, Decl(observable.ts, 1, 18))
42+
>T : Symbol(T, Decl(observable.ts, 0, 32))
43+
>Observable : Symbol(Observable, Decl(observable.ts, 0, 0))
44+
>T : Symbol(T, Decl(observable.ts, 0, 32))
45+
}
46+
47+
=== tests/cases/compiler/main.ts ===
48+
import { Observable } from "./observable"
49+
>Observable : Symbol(Observable, Decl(main.ts, 0, 8))
50+
51+
import "./map1";
52+
import "./map2";
53+
54+
let x: Observable<number>;
55+
>x : Symbol(x, Decl(main.ts, 4, 3))
56+
>Observable : Symbol(Observable, Decl(main.ts, 0, 8))
57+
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
=== tests/cases/compiler/map1.ts ===
2+
3+
import { Observable } from "./observable"
4+
>Observable : typeof Observable
5+
6+
(<any>Observable.prototype).map = function() { }
7+
>(<any>Observable.prototype).map = function() { } : () => void
8+
>(<any>Observable.prototype).map : any
9+
>(<any>Observable.prototype) : any
10+
><any>Observable.prototype : any
11+
>Observable.prototype : Observable<any>
12+
>Observable : typeof Observable
13+
>prototype : Observable<any>
14+
>map : any
15+
>function() { } : () => void
16+
17+
declare module "./observable" {
18+
interface I {x0}
19+
>I : I
20+
>x0 : any
21+
}
22+
23+
=== tests/cases/compiler/map2.ts ===
24+
import { Observable } from "./observable"
25+
>Observable : typeof Observable
26+
27+
(<any>Observable.prototype).map = function() { }
28+
>(<any>Observable.prototype).map = function() { } : () => void
29+
>(<any>Observable.prototype).map : any
30+
>(<any>Observable.prototype) : any
31+
><any>Observable.prototype : any
32+
>Observable.prototype : Observable<any>
33+
>Observable : typeof Observable
34+
>prototype : Observable<any>
35+
>map : any
36+
>function() { } : () => void
37+
38+
declare module "./observable" {
39+
interface I {x1}
40+
>I : I
41+
>x1 : any
42+
}
43+
44+
45+
=== tests/cases/compiler/observable.ts ===
46+
export declare class Observable<T> {
47+
>Observable : Observable<T>
48+
>T : T
49+
50+
filter(pred: (e:T) => boolean): Observable<T>;
51+
>filter : (pred: (e: T) => boolean) => Observable<T>
52+
>pred : (e: T) => boolean
53+
>e : T
54+
>T : T
55+
>Observable : Observable<T>
56+
>T : T
57+
}
58+
59+
=== tests/cases/compiler/main.ts ===
60+
import { Observable } from "./observable"
61+
>Observable : typeof Observable
62+
63+
import "./map1";
64+
import "./map2";
65+
66+
let x: Observable<number>;
67+
>x : Observable<number>
68+
>Observable : Observable<T>
69+

tests/baselines/reference/moduleAugmentationGlobal1.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {A} from "./f1";
1010

1111
// change the shape of Array<T>
1212
declare global {
13-
>global : typeof
13+
>global : any
1414

1515
interface Array<T> {
1616
>Array : T[]

tests/baselines/reference/moduleAugmentationGlobal2.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {A} from "./f1";
1010
>A : typeof A
1111

1212
declare global {
13-
>global : typeof
13+
>global : any
1414

1515
interface Array<T> {
1616
>Array : T[]

tests/baselines/reference/moduleAugmentationGlobal3.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {A} from "./f1";
1010
>A : typeof A
1111

1212
declare global {
13-
>global : typeof
13+
>global : any
1414

1515
interface Array<T> {
1616
>Array : T[]

tests/baselines/reference/moduleAugmentationInAmbientModule5.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ declare module "array" {
2929
>A : typeof A
3030

3131
global {
32-
>global : typeof
32+
>global : any
3333

3434
interface Array<T> {
3535
>Array : T[]
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//// [module_augmentUninstantiatedModule.ts]
2+
declare module "foo" {
3+
namespace M {}
4+
var M;
5+
export = M;
6+
}
7+
8+
declare module "bar" {
9+
module "foo" {}
10+
}
11+
12+
//// [module_augmentUninstantiatedModule.js]
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
=== tests/cases/compiler/module_augmentUninstantiatedModule.ts ===
2+
declare module "foo" {
3+
namespace M {}
4+
>M : Symbol(, Decl(module_augmentUninstantiatedModule.ts, 0, 22), Decl(module_augmentUninstantiatedModule.ts, 2, 6), Decl(module_augmentUninstantiatedModule.ts, 6, 22))
5+
6+
var M;
7+
>M : Symbol(, Decl(module_augmentUninstantiatedModule.ts, 0, 22), Decl(module_augmentUninstantiatedModule.ts, 2, 6), Decl(module_augmentUninstantiatedModule.ts, 6, 22))
8+
9+
export = M;
10+
>M : Symbol(M, Decl(module_augmentUninstantiatedModule.ts, 0, 22), Decl(module_augmentUninstantiatedModule.ts, 2, 6))
11+
}
12+
13+
declare module "bar" {
14+
module "foo" {}
15+
}

0 commit comments

Comments
 (0)