diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts
index c1626ff0b7584..a29c8d06e48f3 100644
--- a/src/compiler/checker.ts
+++ b/src/compiler/checker.ts
@@ -19673,7 +19673,7 @@ namespace ts {
}
function checkGrammarTopLevelElementForRequiredDeclareModifier(node: Node): boolean {
- // A declare modifier is required for any top level .d.ts declaration except export=, export default,
+ // A declare modifier is required for any top level .d.ts declaration except export=, export default, export as namespace
// interfaces and imports categories:
//
// DeclarationElement:
@@ -19691,6 +19691,7 @@ namespace ts {
node.kind === SyntaxKind.ImportEqualsDeclaration ||
node.kind === SyntaxKind.ExportDeclaration ||
node.kind === SyntaxKind.ExportAssignment ||
+ node.kind === SyntaxKind.NamespaceExportDeclaration ||
(node.flags & NodeFlags.Ambient) ||
(node.flags & (NodeFlags.Export | NodeFlags.Default))) {
diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts
index 4ae0005e9c5e7..2cfaf1f5cfbc4 100644
--- a/src/compiler/utilities.ts
+++ b/src/compiler/utilities.ts
@@ -1569,6 +1569,7 @@ namespace ts {
case SyntaxKind.MethodSignature:
case SyntaxKind.ModuleDeclaration:
case SyntaxKind.NamespaceImport:
+ case SyntaxKind.NamespaceExportDeclaration:
case SyntaxKind.Parameter:
case SyntaxKind.PropertyAssignment:
case SyntaxKind.PropertyDeclaration:
diff --git a/src/services/services.ts b/src/services/services.ts
index 6ec95343e330d..0f8c350f50e1a 100644
--- a/src/services/services.ts
+++ b/src/services/services.ts
@@ -4830,7 +4830,14 @@ namespace ts {
}
if (symbolFlags & SymbolFlags.Alias) {
addNewLineIfDisplayPartsExist();
- displayParts.push(keywordPart(SyntaxKind.ImportKeyword));
+ if (symbol.declarations[0].kind === SyntaxKind.NamespaceExportDeclaration) {
+ displayParts.push(keywordPart(SyntaxKind.ExportKeyword));
+ displayParts.push(spacePart());
+ displayParts.push(keywordPart(SyntaxKind.NamespaceKeyword));
+ }
+ else {
+ displayParts.push(keywordPart(SyntaxKind.ImportKeyword));
+ }
displayParts.push(spacePart());
addFullSymbolName(symbol);
ts.forEach(symbol.declarations, declaration => {
diff --git a/tests/baselines/reference/umd-augmentation-1.symbols b/tests/baselines/reference/umd-augmentation-1.symbols
index 645511350a91c..70715649894c1 100644
--- a/tests/baselines/reference/umd-augmentation-1.symbols
+++ b/tests/baselines/reference/umd-augmentation-1.symbols
@@ -39,6 +39,7 @@ var t = p.x;
=== tests/cases/conformance/externalModules/node_modules/math2d/index.d.ts ===
export as namespace Math2d;
+>Math2d : Symbol(Math2d, Decl(index.d.ts, 0, 0))
export interface Point {
>Point : Symbol(Point, Decl(index.d.ts, 1, 27))
diff --git a/tests/baselines/reference/umd-augmentation-1.types b/tests/baselines/reference/umd-augmentation-1.types
index 31ac43fe85557..59b577141e055 100644
--- a/tests/baselines/reference/umd-augmentation-1.types
+++ b/tests/baselines/reference/umd-augmentation-1.types
@@ -48,7 +48,7 @@ var t = p.x;
=== tests/cases/conformance/externalModules/node_modules/math2d/index.d.ts ===
export as namespace Math2d;
->Math2d : any
+>Math2d : typeof Math2d
export interface Point {
>Point : Point
diff --git a/tests/baselines/reference/umd-augmentation-2.symbols b/tests/baselines/reference/umd-augmentation-2.symbols
index bd6584d3d7473..a31ed61d531e9 100644
--- a/tests/baselines/reference/umd-augmentation-2.symbols
+++ b/tests/baselines/reference/umd-augmentation-2.symbols
@@ -37,6 +37,7 @@ var t = p.x;
=== tests/cases/conformance/externalModules/node_modules/math2d/index.d.ts ===
export as namespace Math2d;
+>Math2d : Symbol(Math2d, Decl(index.d.ts, 0, 0))
export interface Point {
>Point : Symbol(Point, Decl(index.d.ts, 1, 27))
diff --git a/tests/baselines/reference/umd-augmentation-2.types b/tests/baselines/reference/umd-augmentation-2.types
index 20bba09190314..24fe6df3c3cc5 100644
--- a/tests/baselines/reference/umd-augmentation-2.types
+++ b/tests/baselines/reference/umd-augmentation-2.types
@@ -46,7 +46,7 @@ var t = p.x;
=== tests/cases/conformance/externalModules/node_modules/math2d/index.d.ts ===
export as namespace Math2d;
->Math2d : any
+>Math2d : typeof Math2d
export interface Point {
>Point : Point
diff --git a/tests/baselines/reference/umd-augmentation-3.symbols b/tests/baselines/reference/umd-augmentation-3.symbols
index 3193e83cd1979..3e2df7c8a89ac 100644
--- a/tests/baselines/reference/umd-augmentation-3.symbols
+++ b/tests/baselines/reference/umd-augmentation-3.symbols
@@ -39,6 +39,7 @@ var t = p.x;
=== tests/cases/conformance/externalModules/node_modules/math2d/index.d.ts ===
export as namespace Math2d;
+>Math2d : Symbol(Math2d, Decl(index.d.ts, 0, 0))
export = M2D;
>M2D : Symbol(M2D, Decl(index.d.ts, 3, 13))
diff --git a/tests/baselines/reference/umd-augmentation-3.types b/tests/baselines/reference/umd-augmentation-3.types
index 854ebceff379c..39bc28cbd2451 100644
--- a/tests/baselines/reference/umd-augmentation-3.types
+++ b/tests/baselines/reference/umd-augmentation-3.types
@@ -48,7 +48,7 @@ var t = p.x;
=== tests/cases/conformance/externalModules/node_modules/math2d/index.d.ts ===
export as namespace Math2d;
->Math2d : any
+>Math2d : typeof Math2d
export = M2D;
>M2D : typeof M2D
diff --git a/tests/baselines/reference/umd-augmentation-4.symbols b/tests/baselines/reference/umd-augmentation-4.symbols
index 3f2cc913d8610..7be5d278bf26d 100644
--- a/tests/baselines/reference/umd-augmentation-4.symbols
+++ b/tests/baselines/reference/umd-augmentation-4.symbols
@@ -37,6 +37,7 @@ var t = p.x;
=== tests/cases/conformance/externalModules/node_modules/math2d/index.d.ts ===
export as namespace Math2d;
+>Math2d : Symbol(Math2d, Decl(index.d.ts, 0, 0))
export = M2D;
>M2D : Symbol(M2D, Decl(index.d.ts, 3, 13))
diff --git a/tests/baselines/reference/umd-augmentation-4.types b/tests/baselines/reference/umd-augmentation-4.types
index 71783d0301260..246270aa5a60f 100644
--- a/tests/baselines/reference/umd-augmentation-4.types
+++ b/tests/baselines/reference/umd-augmentation-4.types
@@ -46,7 +46,7 @@ var t = p.x;
=== tests/cases/conformance/externalModules/node_modules/math2d/index.d.ts ===
export as namespace Math2d;
->Math2d : any
+>Math2d : typeof Math2d
export = M2D;
>M2D : typeof M2D
diff --git a/tests/baselines/reference/umd1.symbols b/tests/baselines/reference/umd1.symbols
index 9b964456bcf02..0307a9b78d375 100644
--- a/tests/baselines/reference/umd1.symbols
+++ b/tests/baselines/reference/umd1.symbols
@@ -30,4 +30,5 @@ export interface Thing { n: typeof x }
>x : Symbol(x, Decl(foo.d.ts, 1, 10))
export as namespace Foo;
+>Foo : Symbol(Foo, Decl(foo.d.ts, 3, 38))
diff --git a/tests/baselines/reference/umd1.types b/tests/baselines/reference/umd1.types
index 1767f3b5a899d..1379bba8d5d1c 100644
--- a/tests/baselines/reference/umd1.types
+++ b/tests/baselines/reference/umd1.types
@@ -31,5 +31,5 @@ export interface Thing { n: typeof x }
>x : number
export as namespace Foo;
->Foo : any
+>Foo : typeof Foo
diff --git a/tests/baselines/reference/umd3.symbols b/tests/baselines/reference/umd3.symbols
index 165fd81597aba..c1fd3d6d74fbc 100644
--- a/tests/baselines/reference/umd3.symbols
+++ b/tests/baselines/reference/umd3.symbols
@@ -32,4 +32,5 @@ export interface Thing { n: typeof x }
>x : Symbol(x, Decl(foo.d.ts, 1, 10))
export as namespace Foo;
+>Foo : Symbol(Foo, Decl(foo.d.ts, 3, 38))
diff --git a/tests/baselines/reference/umd3.types b/tests/baselines/reference/umd3.types
index 85ee6bafe5ec1..23149e58d76cc 100644
--- a/tests/baselines/reference/umd3.types
+++ b/tests/baselines/reference/umd3.types
@@ -33,5 +33,5 @@ export interface Thing { n: typeof x }
>x : number
export as namespace Foo;
->Foo : any
+>Foo : typeof Foo
diff --git a/tests/baselines/reference/umd4.symbols b/tests/baselines/reference/umd4.symbols
index 8403187198bf3..d266997770bd3 100644
--- a/tests/baselines/reference/umd4.symbols
+++ b/tests/baselines/reference/umd4.symbols
@@ -32,4 +32,5 @@ export interface Thing { n: typeof x }
>x : Symbol(x, Decl(foo.d.ts, 1, 10))
export as namespace Foo;
+>Foo : Symbol(Foo, Decl(foo.d.ts, 3, 38))
diff --git a/tests/baselines/reference/umd4.types b/tests/baselines/reference/umd4.types
index 579599f56619b..18794258517d3 100644
--- a/tests/baselines/reference/umd4.types
+++ b/tests/baselines/reference/umd4.types
@@ -33,5 +33,5 @@ export interface Thing { n: typeof x }
>x : number
export as namespace Foo;
->Foo : any
+>Foo : typeof Foo
diff --git a/tests/baselines/reference/umd6.symbols b/tests/baselines/reference/umd6.symbols
index d08507f1ea2e7..958875b79ebd3 100644
--- a/tests/baselines/reference/umd6.symbols
+++ b/tests/baselines/reference/umd6.symbols
@@ -18,4 +18,5 @@ export = Thing;
>Thing : Symbol(Thing, Decl(foo.d.ts, 0, 0))
export as namespace Foo;
+>Foo : Symbol(Foo, Decl(foo.d.ts, 4, 15))
diff --git a/tests/baselines/reference/umd6.types b/tests/baselines/reference/umd6.types
index 7318a43057a4e..5b1469cbd6c3c 100644
--- a/tests/baselines/reference/umd6.types
+++ b/tests/baselines/reference/umd6.types
@@ -19,5 +19,5 @@ export = Thing;
>Thing : typeof Thing
export as namespace Foo;
->Foo : any
+>Foo : typeof Thing
diff --git a/tests/baselines/reference/umd7.symbols b/tests/baselines/reference/umd7.symbols
index 0b3ef17fb7b72..19b56ed30f3ba 100644
--- a/tests/baselines/reference/umd7.symbols
+++ b/tests/baselines/reference/umd7.symbols
@@ -13,4 +13,5 @@ export = Thing;
>Thing : Symbol(Thing, Decl(foo.d.ts, 0, 0))
export as namespace Foo;
+>Foo : Symbol(Foo, Decl(foo.d.ts, 2, 15))
diff --git a/tests/baselines/reference/umd7.types b/tests/baselines/reference/umd7.types
index 60782543710bc..d83e039b674e1 100644
--- a/tests/baselines/reference/umd7.types
+++ b/tests/baselines/reference/umd7.types
@@ -14,5 +14,5 @@ export = Thing;
>Thing : () => number
export as namespace Foo;
->Foo : any
+>Foo : () => number
diff --git a/tests/baselines/reference/umd8.symbols b/tests/baselines/reference/umd8.symbols
index 8c38f267a2ae9..97da693b38f12 100644
--- a/tests/baselines/reference/umd8.symbols
+++ b/tests/baselines/reference/umd8.symbols
@@ -22,4 +22,5 @@ export = Thing;
>Thing : Symbol(Thing, Decl(foo.d.ts, 0, 0))
export as namespace Foo;
+>Foo : Symbol(Foo, Decl(foo.d.ts, 4, 15))
diff --git a/tests/baselines/reference/umd8.types b/tests/baselines/reference/umd8.types
index 0e66a49b9630e..ae3bdfd5fc89e 100644
--- a/tests/baselines/reference/umd8.types
+++ b/tests/baselines/reference/umd8.types
@@ -23,5 +23,5 @@ export = Thing;
>Thing : Thing
export as namespace Foo;
->Foo : any
+>Foo : typeof Thing
diff --git a/tests/cases/fourslash/findAllRefsForUMDModuleAlias1.ts b/tests/cases/fourslash/findAllRefsForUMDModuleAlias1.ts
new file mode 100644
index 0000000000000..4177e154532b8
--- /dev/null
+++ b/tests/cases/fourslash/findAllRefsForUMDModuleAlias1.ts
@@ -0,0 +1,13 @@
+///
+
+// @Filename: 0.d.ts
+//// export function doThing(): string;
+//// export function doTheOtherThing(): void;
+
+//// export as namespace [|myLib|];
+
+// @Filename: 1.ts
+//// ///
+//// [|myLib|].doThing();
+
+verify.rangesReferenceEachOther();
diff --git a/tests/cases/fourslash/quickInfoForUMDModuleAlias.ts b/tests/cases/fourslash/quickInfoForUMDModuleAlias.ts
new file mode 100644
index 0000000000000..085ea33b87446
--- /dev/null
+++ b/tests/cases/fourslash/quickInfoForUMDModuleAlias.ts
@@ -0,0 +1,17 @@
+///
+
+// @Filename: 0.d.ts
+//// export function doThing(): string;
+//// export function doTheOtherThing(): void;
+
+//// export as namespace /*0*/myLib;
+
+// @Filename: 1.ts
+//// ///
+//// /*1*/myLib.doThing();
+
+goTo.marker("0");
+verify.quickInfoIs("export namespace myLib");
+
+goTo.marker("1");
+verify.quickInfoIs("export namespace myLib");
diff --git a/tests/cases/fourslash/renameAlias.ts b/tests/cases/fourslash/renameAlias.ts
index e3f57ac7b4182..e0408af656fc3 100644
--- a/tests/cases/fourslash/renameAlias.ts
+++ b/tests/cases/fourslash/renameAlias.ts
@@ -4,8 +4,8 @@
////import [|M|] = SomeModule;
////import C = [|M|].SomeClass;
-let ranges = test.ranges()
-for (let range of ranges) {
- goTo.position(range.start);
- verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false);
+let ranges = test.ranges()
+for (let range of ranges) {
+ goTo.position(range.start);
+ verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false);
}
\ No newline at end of file
diff --git a/tests/cases/fourslash/renameUMDModuleAlias1.ts b/tests/cases/fourslash/renameUMDModuleAlias1.ts
new file mode 100644
index 0000000000000..94aabcdbde522
--- /dev/null
+++ b/tests/cases/fourslash/renameUMDModuleAlias1.ts
@@ -0,0 +1,17 @@
+///
+
+// @Filename: 0.d.ts
+//// export function doThing(): string;
+//// export function doTheOtherThing(): void;
+
+//// export as namespace [|myLib|];
+
+// @Filename: 1.ts
+//// ///
+//// [|myLib|].doThing();
+
+const ranges = test.ranges()
+for (const range of ranges) {
+ goTo.position(range.start);
+ verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false);
+}
\ No newline at end of file
diff --git a/tests/cases/fourslash/renameUMDModuleAlias2.ts b/tests/cases/fourslash/renameUMDModuleAlias2.ts
new file mode 100644
index 0000000000000..0daa4087b0d61
--- /dev/null
+++ b/tests/cases/fourslash/renameUMDModuleAlias2.ts
@@ -0,0 +1,14 @@
+///
+
+// @Filename: 0.d.ts
+//// export function doThing(): string;
+//// export function doTheOtherThing(): void;
+
+//// export as namespace /**/[|myLib|];
+
+// @Filename: 1.ts
+//// ///
+//// myLib.doThing();
+
+goTo.marker();
+verify.renameInfoSucceeded("myLib");
\ No newline at end of file