From da715633fff748a6a45655ad7a0c4dab54417350 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Wed, 13 Sep 2017 11:05:11 -0700 Subject: [PATCH] Add error for using generalized expressions with export assignments in ambient contexts --- src/compiler/checker.ts | 4 ++ src/compiler/diagnosticMessages.json | 4 ++ .../ambientExportDefaultErrors.errors.txt | 41 +++++++++++++++++++ .../reference/ambientExportDefaultErrors.js | 39 ++++++++++++++++++ .../baselines/reference/es5-commonjs7.symbols | 4 +- tests/baselines/reference/es5-commonjs7.types | 4 +- tests/baselines/reference/typeAliasExport.js | 2 +- .../reference/typeAliasExport.symbols | 4 +- .../baselines/reference/typeAliasExport.types | 4 +- .../compiler/ambientExportDefaultErrors.ts | 27 ++++++++++++ tests/cases/compiler/es5-commonjs7.ts | 2 +- tests/cases/compiler/typeAliasExport.ts | 2 +- 12 files changed, 130 insertions(+), 7 deletions(-) create mode 100644 tests/baselines/reference/ambientExportDefaultErrors.errors.txt create mode 100644 tests/baselines/reference/ambientExportDefaultErrors.js create mode 100644 tests/cases/compiler/ambientExportDefaultErrors.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5c6a8b5911960..f4609ac9498e8 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -22311,6 +22311,10 @@ namespace ts { checkExternalModuleExports(container); + if (isInAmbientContext(node) && !isEntityNameExpression(node.expression)) { + grammarErrorOnNode(node.expression, Diagnostics.The_expression_of_an_export_assignment_must_be_an_identifier_or_qualified_name_in_an_ambient_context); + } + if (node.isExportEquals && !isInAmbientContext(node)) { if (modulekind >= ModuleKind.ES2015) { // export assignment is not supported in es6 modules diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index af7f6d6c94952..8a76ddcda9ae1 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -2212,6 +2212,10 @@ "category": "Error", "code": 2713 }, + "The expression of an export assignment must be an identifier or qualified name in an ambient context.": { + "category": "Error", + "code": 2714 + }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", diff --git a/tests/baselines/reference/ambientExportDefaultErrors.errors.txt b/tests/baselines/reference/ambientExportDefaultErrors.errors.txt new file mode 100644 index 0000000000000..246ff5147b2a1 --- /dev/null +++ b/tests/baselines/reference/ambientExportDefaultErrors.errors.txt @@ -0,0 +1,41 @@ +tests/cases/compiler/foo.d.ts(1,16): error TS2714: The expression of an export assignment must be an identifier or qualified name in an ambient context. +tests/cases/compiler/foo2.d.ts(1,10): error TS2714: The expression of an export assignment must be an identifier or qualified name in an ambient context. +tests/cases/compiler/indirection.d.ts(3,20): error TS2714: The expression of an export assignment must be an identifier or qualified name in an ambient context. +tests/cases/compiler/indirection2.d.ts(3,14): error TS2714: The expression of an export assignment must be an identifier or qualified name in an ambient context. + + +==== tests/cases/compiler/consumer.ts (0 errors) ==== + /// + /// + import "indirect"; + import "foo"; + import "indirect2"; + import "foo2"; +==== tests/cases/compiler/foo.d.ts (1 errors) ==== + export default 2 + 2; + ~~~~~ +!!! error TS2714: The expression of an export assignment must be an identifier or qualified name in an ambient context. + export as namespace Foo; + +==== tests/cases/compiler/foo2.d.ts (1 errors) ==== + export = 2 + 2; + ~~~~~ +!!! error TS2714: The expression of an export assignment must be an identifier or qualified name in an ambient context. + export as namespace Foo2; + +==== tests/cases/compiler/indirection.d.ts (1 errors) ==== + /// + declare module "indirect" { + export default typeof Foo.default; + ~~~~~~~~~~~~~~~~~~ +!!! error TS2714: The expression of an export assignment must be an identifier or qualified name in an ambient context. + } + +==== tests/cases/compiler/indirection2.d.ts (1 errors) ==== + /// + declare module "indirect2" { + export = typeof Foo2; + ~~~~~~~~~~~ +!!! error TS2714: The expression of an export assignment must be an identifier or qualified name in an ambient context. + } + \ No newline at end of file diff --git a/tests/baselines/reference/ambientExportDefaultErrors.js b/tests/baselines/reference/ambientExportDefaultErrors.js new file mode 100644 index 0000000000000..3d8d2bf65f97d --- /dev/null +++ b/tests/baselines/reference/ambientExportDefaultErrors.js @@ -0,0 +1,39 @@ +//// [tests/cases/compiler/ambientExportDefaultErrors.ts] //// + +//// [foo.d.ts] +export default 2 + 2; +export as namespace Foo; + +//// [foo2.d.ts] +export = 2 + 2; +export as namespace Foo2; + +//// [indirection.d.ts] +/// +declare module "indirect" { + export default typeof Foo.default; +} + +//// [indirection2.d.ts] +/// +declare module "indirect2" { + export = typeof Foo2; +} + +//// [consumer.ts] +/// +/// +import "indirect"; +import "foo"; +import "indirect2"; +import "foo2"; + +//// [consumer.js] +"use strict"; +exports.__esModule = true; +/// +/// +require("indirect"); +require("foo"); +require("indirect2"); +require("foo2"); diff --git a/tests/baselines/reference/es5-commonjs7.symbols b/tests/baselines/reference/es5-commonjs7.symbols index 0ac992e7db9bb..ed8247a68783a 100644 --- a/tests/baselines/reference/es5-commonjs7.symbols +++ b/tests/baselines/reference/es5-commonjs7.symbols @@ -1,5 +1,7 @@ === tests/cases/compiler/test.d.ts === -export default "test"; +export default undefined; +>undefined : Symbol(default) + export var __esModule; >__esModule : Symbol(__esModule, Decl(test.d.ts, 1, 10)) diff --git a/tests/baselines/reference/es5-commonjs7.types b/tests/baselines/reference/es5-commonjs7.types index 60d9f9b6c62a9..5b6c3f1e81614 100644 --- a/tests/baselines/reference/es5-commonjs7.types +++ b/tests/baselines/reference/es5-commonjs7.types @@ -1,5 +1,7 @@ === tests/cases/compiler/test.d.ts === -export default "test"; +export default undefined; +>undefined : undefined + export var __esModule; >__esModule : any diff --git a/tests/baselines/reference/typeAliasExport.js b/tests/baselines/reference/typeAliasExport.js index fa864f571eaf0..dca14cea38e5e 100644 --- a/tests/baselines/reference/typeAliasExport.js +++ b/tests/baselines/reference/typeAliasExport.js @@ -1,6 +1,6 @@ //// [typeAliasExport.ts] declare module "a" { - export default 0 + export default undefined export var a; export type a = typeof a; } diff --git a/tests/baselines/reference/typeAliasExport.symbols b/tests/baselines/reference/typeAliasExport.symbols index 1f580b03011c5..e019ca7a10b06 100644 --- a/tests/baselines/reference/typeAliasExport.symbols +++ b/tests/baselines/reference/typeAliasExport.symbols @@ -1,6 +1,8 @@ === tests/cases/compiler/typeAliasExport.ts === declare module "a" { - export default 0 + export default undefined +>undefined : Symbol(default) + export var a; >a : Symbol(a, Decl(typeAliasExport.ts, 2, 12), Decl(typeAliasExport.ts, 2, 15)) diff --git a/tests/baselines/reference/typeAliasExport.types b/tests/baselines/reference/typeAliasExport.types index afa26073061c4..e9a7b92c3e75f 100644 --- a/tests/baselines/reference/typeAliasExport.types +++ b/tests/baselines/reference/typeAliasExport.types @@ -1,6 +1,8 @@ === tests/cases/compiler/typeAliasExport.ts === declare module "a" { - export default 0 + export default undefined +>undefined : undefined + export var a; >a : any diff --git a/tests/cases/compiler/ambientExportDefaultErrors.ts b/tests/cases/compiler/ambientExportDefaultErrors.ts new file mode 100644 index 0000000000000..589af41333aed --- /dev/null +++ b/tests/cases/compiler/ambientExportDefaultErrors.ts @@ -0,0 +1,27 @@ +// @filename: foo.d.ts +export default 2 + 2; +export as namespace Foo; + +// @filename: foo2.d.ts +export = 2 + 2; +export as namespace Foo2; + +// @filename: indirection.d.ts +/// +declare module "indirect" { + export default typeof Foo.default; +} + +// @filename: indirection2.d.ts +/// +declare module "indirect2" { + export = typeof Foo2; +} + +// @filename: consumer.ts +/// +/// +import "indirect"; +import "foo"; +import "indirect2"; +import "foo2"; \ No newline at end of file diff --git a/tests/cases/compiler/es5-commonjs7.ts b/tests/cases/compiler/es5-commonjs7.ts index 384feb2263883..0ad10c1822dac 100644 --- a/tests/cases/compiler/es5-commonjs7.ts +++ b/tests/cases/compiler/es5-commonjs7.ts @@ -4,5 +4,5 @@ // @module: commonjs // @filename: test.d.ts -export default "test"; +export default undefined; export var __esModule; diff --git a/tests/cases/compiler/typeAliasExport.ts b/tests/cases/compiler/typeAliasExport.ts index 706b731f0ab21..914deba40b57c 100644 --- a/tests/cases/compiler/typeAliasExport.ts +++ b/tests/cases/compiler/typeAliasExport.ts @@ -1,5 +1,5 @@ declare module "a" { - export default 0 + export default undefined export var a; export type a = typeof a; } \ No newline at end of file