From 992bbff5b17205f59e22875aab56cd95085312fb Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 27 Apr 2015 13:46:45 -0700 Subject: [PATCH] Fix #2929: relax the check for export= in ES6 if it is resulting from an ambient declaration --- src/compiler/checker.ts | 2 +- .../reference/es6ExportAssignment2.errors.txt | 13 +++++++++ .../reference/es6ExportAssignment2.js | 14 +++++++++ .../reference/es6ExportAssignment3.js | 12 ++++++++ .../reference/es6ExportAssignment3.symbols | 12 ++++++++ .../reference/es6ExportAssignment3.types | 12 ++++++++ .../reference/es6ExportAssignment4.js | 14 +++++++++ .../reference/es6ExportAssignment4.symbols | 14 +++++++++ .../reference/es6ExportAssignment4.types | 14 +++++++++ .../reference/systemExportAssignment.js | 19 ++++++++++++ .../reference/systemExportAssignment.symbols | 12 ++++++++ .../reference/systemExportAssignment.types | 12 ++++++++ .../systemExportAssignment2.errors.txt | 13 +++++++++ .../reference/systemExportAssignment2.js | 29 +++++++++++++++++++ .../reference/systemExportAssignment3.js | 21 ++++++++++++++ .../reference/systemExportAssignment3.symbols | 14 +++++++++ .../reference/systemExportAssignment3.types | 14 +++++++++ tests/cases/compiler/es6ExportAssignment2.ts | 8 +++++ tests/cases/compiler/es6ExportAssignment3.ts | 8 +++++ tests/cases/compiler/es6ExportAssignment4.ts | 10 +++++++ .../cases/compiler/systemExportAssignment.ts | 9 ++++++ .../cases/compiler/systemExportAssignment2.ts | 9 ++++++ .../cases/compiler/systemExportAssignment3.ts | 11 +++++++ 23 files changed, 295 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/es6ExportAssignment2.errors.txt create mode 100644 tests/baselines/reference/es6ExportAssignment2.js create mode 100644 tests/baselines/reference/es6ExportAssignment3.js create mode 100644 tests/baselines/reference/es6ExportAssignment3.symbols create mode 100644 tests/baselines/reference/es6ExportAssignment3.types create mode 100644 tests/baselines/reference/es6ExportAssignment4.js create mode 100644 tests/baselines/reference/es6ExportAssignment4.symbols create mode 100644 tests/baselines/reference/es6ExportAssignment4.types create mode 100644 tests/baselines/reference/systemExportAssignment.js create mode 100644 tests/baselines/reference/systemExportAssignment.symbols create mode 100644 tests/baselines/reference/systemExportAssignment.types create mode 100644 tests/baselines/reference/systemExportAssignment2.errors.txt create mode 100644 tests/baselines/reference/systemExportAssignment2.js create mode 100644 tests/baselines/reference/systemExportAssignment3.js create mode 100644 tests/baselines/reference/systemExportAssignment3.symbols create mode 100644 tests/baselines/reference/systemExportAssignment3.types create mode 100644 tests/cases/compiler/es6ExportAssignment2.ts create mode 100644 tests/cases/compiler/es6ExportAssignment3.ts create mode 100644 tests/cases/compiler/es6ExportAssignment4.ts create mode 100644 tests/cases/compiler/systemExportAssignment.ts create mode 100644 tests/cases/compiler/systemExportAssignment2.ts create mode 100644 tests/cases/compiler/systemExportAssignment3.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 40a6b2e3f72..fc5d9a599e3 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10689,7 +10689,7 @@ module ts { } checkExternalModuleExports(container); - if (node.isExportEquals) { + if (node.isExportEquals && !isInAmbientContext(node)) { if (languageVersion >= ScriptTarget.ES6) { // export assignment is deprecated in es6 or above grammarErrorOnNode(node, Diagnostics.Export_assignment_cannot_be_used_when_targeting_ECMAScript_6_or_higher_Consider_using_export_default_instead); diff --git a/tests/baselines/reference/es6ExportAssignment2.errors.txt b/tests/baselines/reference/es6ExportAssignment2.errors.txt new file mode 100644 index 00000000000..d5e1dfebd9d --- /dev/null +++ b/tests/baselines/reference/es6ExportAssignment2.errors.txt @@ -0,0 +1,13 @@ +tests/cases/compiler/a.ts(3,1): error TS1203: Export assignment cannot be used when targeting ECMAScript 6 or higher. Consider using 'export default' instead. + + +==== tests/cases/compiler/a.ts (1 errors) ==== + + var a = 10; + export = a; // Error: export = not allowed in ES6 + ~~~~~~~~~~~ +!!! error TS1203: Export assignment cannot be used when targeting ECMAScript 6 or higher. Consider using 'export default' instead. + +==== tests/cases/compiler/b.ts (0 errors) ==== + import * as a from "a"; + \ No newline at end of file diff --git a/tests/baselines/reference/es6ExportAssignment2.js b/tests/baselines/reference/es6ExportAssignment2.js new file mode 100644 index 00000000000..f038f71d494 --- /dev/null +++ b/tests/baselines/reference/es6ExportAssignment2.js @@ -0,0 +1,14 @@ +//// [tests/cases/compiler/es6ExportAssignment2.ts] //// + +//// [a.ts] + +var a = 10; +export = a; // Error: export = not allowed in ES6 + +//// [b.ts] +import * as a from "a"; + + +//// [a.js] +var a = 10; +//// [b.js] diff --git a/tests/baselines/reference/es6ExportAssignment3.js b/tests/baselines/reference/es6ExportAssignment3.js new file mode 100644 index 00000000000..1a25ee94023 --- /dev/null +++ b/tests/baselines/reference/es6ExportAssignment3.js @@ -0,0 +1,12 @@ +//// [tests/cases/compiler/es6ExportAssignment3.ts] //// + +//// [a.d.ts] + +declare var a: number; +export = a; // OK, in ambient context + +//// [b.ts] +import * as a from "a"; + + +//// [b.js] diff --git a/tests/baselines/reference/es6ExportAssignment3.symbols b/tests/baselines/reference/es6ExportAssignment3.symbols new file mode 100644 index 00000000000..73346cdc4b8 --- /dev/null +++ b/tests/baselines/reference/es6ExportAssignment3.symbols @@ -0,0 +1,12 @@ +=== tests/cases/compiler/a.d.ts === + +declare var a: number; +>a : Symbol(a, Decl(a.d.ts, 1, 11)) + +export = a; // OK, in ambient context +>a : Symbol(a, Decl(a.d.ts, 1, 11)) + +=== tests/cases/compiler/b.ts === +import * as a from "a"; +>a : Symbol(a, Decl(b.ts, 0, 6)) + diff --git a/tests/baselines/reference/es6ExportAssignment3.types b/tests/baselines/reference/es6ExportAssignment3.types new file mode 100644 index 00000000000..84f896c301d --- /dev/null +++ b/tests/baselines/reference/es6ExportAssignment3.types @@ -0,0 +1,12 @@ +=== tests/cases/compiler/a.d.ts === + +declare var a: number; +>a : number + +export = a; // OK, in ambient context +>a : number + +=== tests/cases/compiler/b.ts === +import * as a from "a"; +>a : number + diff --git a/tests/baselines/reference/es6ExportAssignment4.js b/tests/baselines/reference/es6ExportAssignment4.js new file mode 100644 index 00000000000..a06aa4d49de --- /dev/null +++ b/tests/baselines/reference/es6ExportAssignment4.js @@ -0,0 +1,14 @@ +//// [tests/cases/compiler/es6ExportAssignment4.ts] //// + +//// [modules.d.ts] + +declare module "a" { + var a: number; + export = a; // OK, in ambient context +} + +//// [b.ts] +import * as a from "a"; + + +//// [b.js] diff --git a/tests/baselines/reference/es6ExportAssignment4.symbols b/tests/baselines/reference/es6ExportAssignment4.symbols new file mode 100644 index 00000000000..42d4a9d009f --- /dev/null +++ b/tests/baselines/reference/es6ExportAssignment4.symbols @@ -0,0 +1,14 @@ +=== tests/cases/compiler/modules.d.ts === + +declare module "a" { + var a: number; +>a : Symbol(a, Decl(modules.d.ts, 2, 7)) + + export = a; // OK, in ambient context +>a : Symbol(a, Decl(modules.d.ts, 2, 7)) +} + +=== tests/cases/compiler/b.ts === +import * as a from "a"; +>a : Symbol(a, Decl(b.ts, 0, 6)) + diff --git a/tests/baselines/reference/es6ExportAssignment4.types b/tests/baselines/reference/es6ExportAssignment4.types new file mode 100644 index 00000000000..c32bc14ec90 --- /dev/null +++ b/tests/baselines/reference/es6ExportAssignment4.types @@ -0,0 +1,14 @@ +=== tests/cases/compiler/modules.d.ts === + +declare module "a" { + var a: number; +>a : number + + export = a; // OK, in ambient context +>a : number +} + +=== tests/cases/compiler/b.ts === +import * as a from "a"; +>a : number + diff --git a/tests/baselines/reference/systemExportAssignment.js b/tests/baselines/reference/systemExportAssignment.js new file mode 100644 index 00000000000..bae5f6129ea --- /dev/null +++ b/tests/baselines/reference/systemExportAssignment.js @@ -0,0 +1,19 @@ +//// [tests/cases/compiler/systemExportAssignment.ts] //// + +//// [a.d.ts] + +declare var a: number; +export = a; // OK, in ambient context + +//// [b.ts] +import * as a from "a"; + + +//// [b.js] +System.register([], function(exports_1) { + return { + setters:[], + execute: function() { + } + } +}); diff --git a/tests/baselines/reference/systemExportAssignment.symbols b/tests/baselines/reference/systemExportAssignment.symbols new file mode 100644 index 00000000000..73346cdc4b8 --- /dev/null +++ b/tests/baselines/reference/systemExportAssignment.symbols @@ -0,0 +1,12 @@ +=== tests/cases/compiler/a.d.ts === + +declare var a: number; +>a : Symbol(a, Decl(a.d.ts, 1, 11)) + +export = a; // OK, in ambient context +>a : Symbol(a, Decl(a.d.ts, 1, 11)) + +=== tests/cases/compiler/b.ts === +import * as a from "a"; +>a : Symbol(a, Decl(b.ts, 0, 6)) + diff --git a/tests/baselines/reference/systemExportAssignment.types b/tests/baselines/reference/systemExportAssignment.types new file mode 100644 index 00000000000..84f896c301d --- /dev/null +++ b/tests/baselines/reference/systemExportAssignment.types @@ -0,0 +1,12 @@ +=== tests/cases/compiler/a.d.ts === + +declare var a: number; +>a : number + +export = a; // OK, in ambient context +>a : number + +=== tests/cases/compiler/b.ts === +import * as a from "a"; +>a : number + diff --git a/tests/baselines/reference/systemExportAssignment2.errors.txt b/tests/baselines/reference/systemExportAssignment2.errors.txt new file mode 100644 index 00000000000..5606f8dd631 --- /dev/null +++ b/tests/baselines/reference/systemExportAssignment2.errors.txt @@ -0,0 +1,13 @@ +tests/cases/compiler/a.ts(3,1): error TS1218: Export assignment is not supported when '--module' flag is 'system'. + + +==== tests/cases/compiler/a.ts (1 errors) ==== + + var a = 10; + export = a; // Error: export = not allowed in ES6 + ~~~~~~~~~~~ +!!! error TS1218: Export assignment is not supported when '--module' flag is 'system'. + +==== tests/cases/compiler/b.ts (0 errors) ==== + import * as a from "a"; + \ No newline at end of file diff --git a/tests/baselines/reference/systemExportAssignment2.js b/tests/baselines/reference/systemExportAssignment2.js new file mode 100644 index 00000000000..1ee0f4ff9b8 --- /dev/null +++ b/tests/baselines/reference/systemExportAssignment2.js @@ -0,0 +1,29 @@ +//// [tests/cases/compiler/systemExportAssignment2.ts] //// + +//// [a.ts] + +var a = 10; +export = a; // Error: export = not allowed in ES6 + +//// [b.ts] +import * as a from "a"; + + +//// [a.js] +System.register([], function(exports_1) { + var a; + return { + setters:[], + execute: function() { + a = 10; + } + } +}); +//// [b.js] +System.register([], function(exports_1) { + return { + setters:[], + execute: function() { + } + } +}); diff --git a/tests/baselines/reference/systemExportAssignment3.js b/tests/baselines/reference/systemExportAssignment3.js new file mode 100644 index 00000000000..46fcfd1b0ee --- /dev/null +++ b/tests/baselines/reference/systemExportAssignment3.js @@ -0,0 +1,21 @@ +//// [tests/cases/compiler/systemExportAssignment3.ts] //// + +//// [modules.d.ts] + +declare module "a" { + var a: number; + export = a; // OK, in ambient context +} + +//// [b.ts] +import * as a from "a"; + + +//// [b.js] +System.register([], function(exports_1) { + return { + setters:[], + execute: function() { + } + } +}); diff --git a/tests/baselines/reference/systemExportAssignment3.symbols b/tests/baselines/reference/systemExportAssignment3.symbols new file mode 100644 index 00000000000..42d4a9d009f --- /dev/null +++ b/tests/baselines/reference/systemExportAssignment3.symbols @@ -0,0 +1,14 @@ +=== tests/cases/compiler/modules.d.ts === + +declare module "a" { + var a: number; +>a : Symbol(a, Decl(modules.d.ts, 2, 7)) + + export = a; // OK, in ambient context +>a : Symbol(a, Decl(modules.d.ts, 2, 7)) +} + +=== tests/cases/compiler/b.ts === +import * as a from "a"; +>a : Symbol(a, Decl(b.ts, 0, 6)) + diff --git a/tests/baselines/reference/systemExportAssignment3.types b/tests/baselines/reference/systemExportAssignment3.types new file mode 100644 index 00000000000..c32bc14ec90 --- /dev/null +++ b/tests/baselines/reference/systemExportAssignment3.types @@ -0,0 +1,14 @@ +=== tests/cases/compiler/modules.d.ts === + +declare module "a" { + var a: number; +>a : number + + export = a; // OK, in ambient context +>a : number +} + +=== tests/cases/compiler/b.ts === +import * as a from "a"; +>a : number + diff --git a/tests/cases/compiler/es6ExportAssignment2.ts b/tests/cases/compiler/es6ExportAssignment2.ts new file mode 100644 index 00000000000..b07427209f9 --- /dev/null +++ b/tests/cases/compiler/es6ExportAssignment2.ts @@ -0,0 +1,8 @@ +// @target: es6 + +// @filename: a.ts +var a = 10; +export = a; // Error: export = not allowed in ES6 + +// @filename: b.ts +import * as a from "a"; diff --git a/tests/cases/compiler/es6ExportAssignment3.ts b/tests/cases/compiler/es6ExportAssignment3.ts new file mode 100644 index 00000000000..5c104accb85 --- /dev/null +++ b/tests/cases/compiler/es6ExportAssignment3.ts @@ -0,0 +1,8 @@ +// @target: es6 + +// @filename: a.d.ts +declare var a: number; +export = a; // OK, in ambient context + +// @filename: b.ts +import * as a from "a"; diff --git a/tests/cases/compiler/es6ExportAssignment4.ts b/tests/cases/compiler/es6ExportAssignment4.ts new file mode 100644 index 00000000000..60ef1ccbc9e --- /dev/null +++ b/tests/cases/compiler/es6ExportAssignment4.ts @@ -0,0 +1,10 @@ +// @target: es6 + +// @filename: modules.d.ts +declare module "a" { + var a: number; + export = a; // OK, in ambient context +} + +// @filename: b.ts +import * as a from "a"; diff --git a/tests/cases/compiler/systemExportAssignment.ts b/tests/cases/compiler/systemExportAssignment.ts new file mode 100644 index 00000000000..dbf2826b788 --- /dev/null +++ b/tests/cases/compiler/systemExportAssignment.ts @@ -0,0 +1,9 @@ +// @target: es5 +// @module: system + +// @filename: a.d.ts +declare var a: number; +export = a; // OK, in ambient context + +// @filename: b.ts +import * as a from "a"; diff --git a/tests/cases/compiler/systemExportAssignment2.ts b/tests/cases/compiler/systemExportAssignment2.ts new file mode 100644 index 00000000000..e7b1bf9f24a --- /dev/null +++ b/tests/cases/compiler/systemExportAssignment2.ts @@ -0,0 +1,9 @@ +// @target: es5 +// @module: system + +// @filename: a.ts +var a = 10; +export = a; // Error: export = not allowed in ES6 + +// @filename: b.ts +import * as a from "a"; diff --git a/tests/cases/compiler/systemExportAssignment3.ts b/tests/cases/compiler/systemExportAssignment3.ts new file mode 100644 index 00000000000..6ff15b8692a --- /dev/null +++ b/tests/cases/compiler/systemExportAssignment3.ts @@ -0,0 +1,11 @@ +// @target: es5 +// @module: system + +// @filename: modules.d.ts +declare module "a" { + var a: number; + export = a; // OK, in ambient context +} + +// @filename: b.ts +import * as a from "a";