From 4a6b6d0a04d7781d5b24e074d06b5d733dcc8e78 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 6 Feb 2017 15:34:19 -0800 Subject: [PATCH] Allow export declarations in ambient namespaces --- src/compiler/checker.ts | 4 +++- .../exportDeclarationsInAmbientNamespaces.js | 13 ++++++++++ ...ortDeclarationsInAmbientNamespaces.symbols | 22 +++++++++++++++++ ...xportDeclarationsInAmbientNamespaces.types | 24 +++++++++++++++++++ ...eclarationsInAmbientNamespaces2.errors.txt | 16 +++++++++++++ .../exportDeclarationsInAmbientNamespaces2.js | 13 ++++++++++ .../exportDeclarationsInAmbientNamespaces.ts | 8 +++++++ .../exportDeclarationsInAmbientNamespaces2.ts | 9 +++++++ 8 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/exportDeclarationsInAmbientNamespaces.js create mode 100644 tests/baselines/reference/exportDeclarationsInAmbientNamespaces.symbols create mode 100644 tests/baselines/reference/exportDeclarationsInAmbientNamespaces.types create mode 100644 tests/baselines/reference/exportDeclarationsInAmbientNamespaces2.errors.txt create mode 100644 tests/baselines/reference/exportDeclarationsInAmbientNamespaces2.js create mode 100644 tests/cases/compiler/exportDeclarationsInAmbientNamespaces.ts create mode 100644 tests/cases/compiler/exportDeclarationsInAmbientNamespaces2.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index b5306771dd..7e2582e2b3 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -19372,7 +19372,9 @@ namespace ts { forEach(node.exportClause.elements, checkExportSpecifier); const inAmbientExternalModule = node.parent.kind === SyntaxKind.ModuleBlock && isAmbientModule(node.parent.parent); - if (node.parent.kind !== SyntaxKind.SourceFile && !inAmbientExternalModule) { + const inAmbientNamespaceDeclaration = !inAmbientExternalModule && node.parent.kind === SyntaxKind.ModuleBlock && + !node.moduleSpecifier && isInAmbientContext(node); + if (node.parent.kind !== SyntaxKind.SourceFile && !inAmbientExternalModule && !inAmbientNamespaceDeclaration) { error(node, Diagnostics.Export_declarations_are_not_permitted_in_a_namespace); } } diff --git a/tests/baselines/reference/exportDeclarationsInAmbientNamespaces.js b/tests/baselines/reference/exportDeclarationsInAmbientNamespaces.js new file mode 100644 index 0000000000..d458433aed --- /dev/null +++ b/tests/baselines/reference/exportDeclarationsInAmbientNamespaces.js @@ -0,0 +1,13 @@ +//// [exportDeclarationsInAmbientNamespaces.ts] + +declare namespace Q { + function _try(method: Function, ...args: any[]): any; + export { _try as try }; +} + +Q.try(() => { }); + + + +//// [exportDeclarationsInAmbientNamespaces.js] +Q["try"](function () { }); diff --git a/tests/baselines/reference/exportDeclarationsInAmbientNamespaces.symbols b/tests/baselines/reference/exportDeclarationsInAmbientNamespaces.symbols new file mode 100644 index 0000000000..99e70fe459 --- /dev/null +++ b/tests/baselines/reference/exportDeclarationsInAmbientNamespaces.symbols @@ -0,0 +1,22 @@ +=== tests/cases/compiler/exportDeclarationsInAmbientNamespaces.ts === + +declare namespace Q { +>Q : Symbol(Q, Decl(exportDeclarationsInAmbientNamespaces.ts, 0, 0)) + + function _try(method: Function, ...args: any[]): any; +>_try : Symbol(_try, Decl(exportDeclarationsInAmbientNamespaces.ts, 1, 21)) +>method : Symbol(method, Decl(exportDeclarationsInAmbientNamespaces.ts, 2, 18)) +>Function : Symbol(Function, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --)) +>args : Symbol(args, Decl(exportDeclarationsInAmbientNamespaces.ts, 2, 35)) + + export { _try as try }; +>_try : Symbol(try, Decl(exportDeclarationsInAmbientNamespaces.ts, 3, 12)) +>try : Symbol(try, Decl(exportDeclarationsInAmbientNamespaces.ts, 3, 12)) +} + +Q.try(() => { }); +>Q.try : Symbol(Q.try, Decl(exportDeclarationsInAmbientNamespaces.ts, 3, 12)) +>Q : Symbol(Q, Decl(exportDeclarationsInAmbientNamespaces.ts, 0, 0)) +>try : Symbol(Q.try, Decl(exportDeclarationsInAmbientNamespaces.ts, 3, 12)) + + diff --git a/tests/baselines/reference/exportDeclarationsInAmbientNamespaces.types b/tests/baselines/reference/exportDeclarationsInAmbientNamespaces.types new file mode 100644 index 0000000000..a46d99454f --- /dev/null +++ b/tests/baselines/reference/exportDeclarationsInAmbientNamespaces.types @@ -0,0 +1,24 @@ +=== tests/cases/compiler/exportDeclarationsInAmbientNamespaces.ts === + +declare namespace Q { +>Q : typeof Q + + function _try(method: Function, ...args: any[]): any; +>_try : (method: Function, ...args: any[]) => any +>method : Function +>Function : Function +>args : any[] + + export { _try as try }; +>_try : (method: Function, ...args: any[]) => any +>try : (method: Function, ...args: any[]) => any +} + +Q.try(() => { }); +>Q.try(() => { }) : any +>Q.try : (method: Function, ...args: any[]) => any +>Q : typeof Q +>try : (method: Function, ...args: any[]) => any +>() => { } : () => void + + diff --git a/tests/baselines/reference/exportDeclarationsInAmbientNamespaces2.errors.txt b/tests/baselines/reference/exportDeclarationsInAmbientNamespaces2.errors.txt new file mode 100644 index 0000000000..54c04bd9b1 --- /dev/null +++ b/tests/baselines/reference/exportDeclarationsInAmbientNamespaces2.errors.txt @@ -0,0 +1,16 @@ +tests/cases/compiler/exportDeclarationsInAmbientNamespaces2.ts(7,23): error TS1194: Export declarations are not permitted in a namespace. + + +==== tests/cases/compiler/exportDeclarationsInAmbientNamespaces2.ts (1 errors) ==== + + declare module "mod" { + export var x: number; + } + + declare namespace N { + export { x } from "mod"; // Error + ~~~~~ +!!! error TS1194: Export declarations are not permitted in a namespace. + } + + \ No newline at end of file diff --git a/tests/baselines/reference/exportDeclarationsInAmbientNamespaces2.js b/tests/baselines/reference/exportDeclarationsInAmbientNamespaces2.js new file mode 100644 index 0000000000..6896f13025 --- /dev/null +++ b/tests/baselines/reference/exportDeclarationsInAmbientNamespaces2.js @@ -0,0 +1,13 @@ +//// [exportDeclarationsInAmbientNamespaces2.ts] + +declare module "mod" { + export var x: number; +} + +declare namespace N { + export { x } from "mod"; // Error +} + + + +//// [exportDeclarationsInAmbientNamespaces2.js] diff --git a/tests/cases/compiler/exportDeclarationsInAmbientNamespaces.ts b/tests/cases/compiler/exportDeclarationsInAmbientNamespaces.ts new file mode 100644 index 0000000000..c46325068f --- /dev/null +++ b/tests/cases/compiler/exportDeclarationsInAmbientNamespaces.ts @@ -0,0 +1,8 @@ + +declare namespace Q { + function _try(method: Function, ...args: any[]): any; + export { _try as try }; +} + +Q.try(() => { }); + diff --git a/tests/cases/compiler/exportDeclarationsInAmbientNamespaces2.ts b/tests/cases/compiler/exportDeclarationsInAmbientNamespaces2.ts new file mode 100644 index 0000000000..c32c2d01ae --- /dev/null +++ b/tests/cases/compiler/exportDeclarationsInAmbientNamespaces2.ts @@ -0,0 +1,9 @@ + +declare module "mod" { + export var x: number; +} + +declare namespace N { + export { x } from "mod"; // Error +} +