From f252b9dd58fe895613573b00efacbeb7daf1a981 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Thu, 21 Jan 2016 13:35:58 -0800 Subject: [PATCH] handle undefined entry as export specifier --- src/compiler/checker.ts | 2 +- .../reference/reExportUndefined1.errors.txt | 8 +++++++ .../baselines/reference/reExportUndefined1.js | 6 ++++++ .../baselines/reference/reExportUndefined2.js | 20 ++++++++++++++++++ .../reference/reExportUndefined2.symbols | 20 ++++++++++++++++++ .../reference/reExportUndefined2.types | 21 +++++++++++++++++++ tests/cases/compiler/reExportUndefined1.ts | 4 ++++ tests/cases/compiler/reExportUndefined2.ts | 10 +++++++++ 8 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/reExportUndefined1.errors.txt create mode 100644 tests/baselines/reference/reExportUndefined1.js create mode 100644 tests/baselines/reference/reExportUndefined2.js create mode 100644 tests/baselines/reference/reExportUndefined2.symbols create mode 100644 tests/baselines/reference/reExportUndefined2.types create mode 100644 tests/cases/compiler/reExportUndefined1.ts create mode 100644 tests/cases/compiler/reExportUndefined2.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index edc1868401d..b3f1cfe6c74 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -14476,7 +14476,7 @@ namespace ts { // find immediate value referenced by exported name (SymbolFlags.Alias is set so we don't chase down aliases) const symbol = resolveName(exportedName, exportedName.text, SymbolFlags.Value | SymbolFlags.Type | SymbolFlags.Namespace | SymbolFlags.Alias, /*nameNotFoundMessage*/ undefined, /*nameArg*/ undefined); - if (symbol && isGlobalSourceFile(getDeclarationContainer(symbol.declarations[0]))) { + if (symbol && (symbol === undefinedSymbol || isGlobalSourceFile(getDeclarationContainer(symbol.declarations[0])))) { error(exportedName, Diagnostics.Cannot_re_export_name_that_is_not_defined_in_the_module); } else { diff --git a/tests/baselines/reference/reExportUndefined1.errors.txt b/tests/baselines/reference/reExportUndefined1.errors.txt new file mode 100644 index 00000000000..ff3259ae37e --- /dev/null +++ b/tests/baselines/reference/reExportUndefined1.errors.txt @@ -0,0 +1,8 @@ +tests/cases/compiler/a.ts(2,10): error TS2661: Cannot re-export name that is not defined in the module. + + +==== tests/cases/compiler/a.ts (1 errors) ==== + + export { undefined }; + ~~~~~~~~~ +!!! error TS2661: Cannot re-export name that is not defined in the module. \ No newline at end of file diff --git a/tests/baselines/reference/reExportUndefined1.js b/tests/baselines/reference/reExportUndefined1.js new file mode 100644 index 00000000000..94729e4f544 --- /dev/null +++ b/tests/baselines/reference/reExportUndefined1.js @@ -0,0 +1,6 @@ +//// [a.ts] + +export { undefined }; + +//// [a.js] +"use strict"; diff --git a/tests/baselines/reference/reExportUndefined2.js b/tests/baselines/reference/reExportUndefined2.js new file mode 100644 index 00000000000..53b78599cbe --- /dev/null +++ b/tests/baselines/reference/reExportUndefined2.js @@ -0,0 +1,20 @@ +//// [tests/cases/compiler/reExportUndefined2.ts] //// + +//// [a.ts] + +var undefined; +export { undefined }; + +//// [b.ts] +import { undefined } from "./a"; +declare function use(a: number); +use(undefined); + +//// [a.js] +"use strict"; +var undefined; +exports.undefined = undefined; +//// [b.js] +"use strict"; +var a_1 = require("./a"); +use(a_1.undefined); diff --git a/tests/baselines/reference/reExportUndefined2.symbols b/tests/baselines/reference/reExportUndefined2.symbols new file mode 100644 index 00000000000..c4f532ed6dc --- /dev/null +++ b/tests/baselines/reference/reExportUndefined2.symbols @@ -0,0 +1,20 @@ +=== tests/cases/compiler/a.ts === + +var undefined; +>undefined : Symbol(undefined, Decl(a.ts, 1, 3)) + +export { undefined }; +>undefined : Symbol(undefined, Decl(a.ts, 2, 8)) + +=== tests/cases/compiler/b.ts === +import { undefined } from "./a"; +>undefined : Symbol(undefined, Decl(b.ts, 0, 8)) + +declare function use(a: number); +>use : Symbol(use, Decl(b.ts, 0, 32)) +>a : Symbol(a, Decl(b.ts, 1, 21)) + +use(undefined); +>use : Symbol(use, Decl(b.ts, 0, 32)) +>undefined : Symbol(undefined, Decl(b.ts, 0, 8)) + diff --git a/tests/baselines/reference/reExportUndefined2.types b/tests/baselines/reference/reExportUndefined2.types new file mode 100644 index 00000000000..d3f3dc9d726 --- /dev/null +++ b/tests/baselines/reference/reExportUndefined2.types @@ -0,0 +1,21 @@ +=== tests/cases/compiler/a.ts === + +var undefined; +>undefined : any + +export { undefined }; +>undefined : any + +=== tests/cases/compiler/b.ts === +import { undefined } from "./a"; +>undefined : any + +declare function use(a: number); +>use : (a: number) => any +>a : number + +use(undefined); +>use(undefined) : any +>use : (a: number) => any +>undefined : any + diff --git a/tests/cases/compiler/reExportUndefined1.ts b/tests/cases/compiler/reExportUndefined1.ts new file mode 100644 index 00000000000..7d949ca1c28 --- /dev/null +++ b/tests/cases/compiler/reExportUndefined1.ts @@ -0,0 +1,4 @@ +// @module: commonjs + +// @filename: a.ts +export { undefined }; \ No newline at end of file diff --git a/tests/cases/compiler/reExportUndefined2.ts b/tests/cases/compiler/reExportUndefined2.ts new file mode 100644 index 00000000000..0d3e381fcfa --- /dev/null +++ b/tests/cases/compiler/reExportUndefined2.ts @@ -0,0 +1,10 @@ +// @module: commonjs + +// @filename: a.ts +var undefined; +export { undefined }; + +// @filename: b.ts +import { undefined } from "./a"; +declare function use(a: number); +use(undefined); \ No newline at end of file