From 132d75c26721f7b11d137c2a3c3139faaa09d94f Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Mon, 7 Mar 2016 12:30:57 -0800 Subject: [PATCH] Support UMD when targeted module uses `export = ` --- src/compiler/checker.ts | 8 ++++++- tests/baselines/reference/umd6.js | 18 +++++++++++++++ tests/baselines/reference/umd6.symbols | 19 +++++++++++++++ tests/baselines/reference/umd6.types | 23 +++++++++++++++++++ .../cases/conformance/externalModules/umd6.ts | 13 +++++++++++ 5 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/umd6.js create mode 100644 tests/baselines/reference/umd6.symbols create mode 100644 tests/baselines/reference/umd6.types create mode 100644 tests/cases/conformance/externalModules/umd6.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 746b3236cf3..6bf47ba4b98 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -982,7 +982,13 @@ namespace ts { } function getTargetOfGlobalModuleExportDeclaration(node: GlobalModuleExportDeclaration): Symbol { - return node.parent.symbol; + const moduleSymbol = node.parent.symbol; + if (moduleSymbol && moduleSymbol.exports && moduleSymbol.exports["export="]) { + return moduleSymbol.exports["export="].exportSymbol; + } + else { + return moduleSymbol; + } } function getTargetOfExportSpecifier(node: ExportSpecifier): Symbol { diff --git a/tests/baselines/reference/umd6.js b/tests/baselines/reference/umd6.js new file mode 100644 index 00000000000..d4d84fd0384 --- /dev/null +++ b/tests/baselines/reference/umd6.js @@ -0,0 +1,18 @@ +//// [tests/cases/conformance/externalModules/umd6.ts] //// + +//// [foo.d.ts] + +declare namespace Thing { + export function fn(): number; +} +export = Thing; +export as namespace Foo; + +//// [a.ts] +/// +let y: number = Foo.fn(); + + +//// [a.js] +/// +var y = exports.Foo.fn(); diff --git a/tests/baselines/reference/umd6.symbols b/tests/baselines/reference/umd6.symbols new file mode 100644 index 00000000000..3b417e005d6 --- /dev/null +++ b/tests/baselines/reference/umd6.symbols @@ -0,0 +1,19 @@ +=== tests/cases/conformance/externalModules/a.ts === +/// +let y: number = Foo.fn(); +>y : Symbol(y, Decl(a.ts, 1, 3)) +>Foo : Symbol(Foo, Decl(foo.d.ts, 4, 15)) + +=== tests/cases/conformance/externalModules/foo.d.ts === + +declare namespace Thing { +>Thing : Symbol(Thing, Decl(foo.d.ts, 0, 0)) + + export function fn(): number; +>fn : Symbol(fn, Decl(foo.d.ts, 1, 25)) +} +export = Thing; +>Thing : Symbol(Thing, Decl(foo.d.ts, 0, 0)) + +export as namespace Foo; + diff --git a/tests/baselines/reference/umd6.types b/tests/baselines/reference/umd6.types new file mode 100644 index 00000000000..dc0f45846c2 --- /dev/null +++ b/tests/baselines/reference/umd6.types @@ -0,0 +1,23 @@ +=== tests/cases/conformance/externalModules/a.ts === +/// +let y: number = Foo.fn(); +>y : number +>Foo.fn() : any +>Foo.fn : any +>Foo : any +>fn : any + +=== tests/cases/conformance/externalModules/foo.d.ts === + +declare namespace Thing { +>Thing : typeof Thing + + export function fn(): number; +>fn : () => number +} +export = Thing; +>Thing : typeof Thing + +export as namespace Foo; +>Foo : any + diff --git a/tests/cases/conformance/externalModules/umd6.ts b/tests/cases/conformance/externalModules/umd6.ts new file mode 100644 index 00000000000..2f9e49072cf --- /dev/null +++ b/tests/cases/conformance/externalModules/umd6.ts @@ -0,0 +1,13 @@ +// @module: commonjs +// @noImplicitReferences: true + +// @filename: foo.d.ts +declare namespace Thing { + export function fn(): number; +} +export = Thing; +export as namespace Foo; + +// @filename: a.ts +/// +let y: number = Foo.fn();