From a320e1b554af999fb3452e784d1838c5d57272dc Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Wed, 29 Jul 2020 11:41:58 -0400 Subject: [PATCH] Make `getLocalSymbolForExportDefault` look harder for an export Look for a symbol that has a `.localSymbol` property instead of blindly using the first one. Fixes #37829. --- src/compiler/utilities.ts | 6 +++++- .../reference/exportDefaultInterfaceAndValue.js | 11 +++++++++++ .../reference/exportDefaultInterfaceAndValue.symbols | 10 ++++++++++ .../reference/exportDefaultInterfaceAndValue.types | 10 ++++++++++ .../cases/compiler/exportDefaultInterfaceAndValue.ts | 3 +++ 5 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/exportDefaultInterfaceAndValue.js create mode 100644 tests/baselines/reference/exportDefaultInterfaceAndValue.symbols create mode 100644 tests/baselines/reference/exportDefaultInterfaceAndValue.types create mode 100644 tests/cases/compiler/exportDefaultInterfaceAndValue.ts diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 41d513a2523..b978c3dbc4e 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -4769,7 +4769,11 @@ namespace ts { } export function getLocalSymbolForExportDefault(symbol: Symbol) { - return isExportDefaultSymbol(symbol) ? symbol.declarations[0].localSymbol : undefined; + if (!isExportDefaultSymbol(symbol)) return undefined; + for (const decl of symbol.declarations) { + if (decl.localSymbol) return decl.localSymbol; + } + return undefined; } function isExportDefaultSymbol(symbol: Symbol): boolean { diff --git a/tests/baselines/reference/exportDefaultInterfaceAndValue.js b/tests/baselines/reference/exportDefaultInterfaceAndValue.js new file mode 100644 index 00000000000..f98e4a04e76 --- /dev/null +++ b/tests/baselines/reference/exportDefaultInterfaceAndValue.js @@ -0,0 +1,11 @@ +//// [exportDefaultInterfaceAndValue.ts] +export default interface A { a: string; } +export default function() { return 1; } +declare var x: A; + + +//// [exportDefaultInterfaceAndValue.js] +"use strict"; +exports.__esModule = true; +function default_1() { return 1; } +exports["default"] = default_1; diff --git a/tests/baselines/reference/exportDefaultInterfaceAndValue.symbols b/tests/baselines/reference/exportDefaultInterfaceAndValue.symbols new file mode 100644 index 00000000000..9ab2e49b943 --- /dev/null +++ b/tests/baselines/reference/exportDefaultInterfaceAndValue.symbols @@ -0,0 +1,10 @@ +=== tests/cases/compiler/exportDefaultInterfaceAndValue.ts === +export default interface A { a: string; } +>A : Symbol(A, Decl(exportDefaultInterfaceAndValue.ts, 0, 41), Decl(exportDefaultInterfaceAndValue.ts, 0, 0)) +>a : Symbol(A.a, Decl(exportDefaultInterfaceAndValue.ts, 0, 28)) + +export default function() { return 1; } +declare var x: A; +>x : Symbol(x, Decl(exportDefaultInterfaceAndValue.ts, 2, 11)) +>A : Symbol(A, Decl(exportDefaultInterfaceAndValue.ts, 0, 41), Decl(exportDefaultInterfaceAndValue.ts, 0, 0)) + diff --git a/tests/baselines/reference/exportDefaultInterfaceAndValue.types b/tests/baselines/reference/exportDefaultInterfaceAndValue.types new file mode 100644 index 00000000000..7b3e0cbbd15 --- /dev/null +++ b/tests/baselines/reference/exportDefaultInterfaceAndValue.types @@ -0,0 +1,10 @@ +=== tests/cases/compiler/exportDefaultInterfaceAndValue.ts === +export default interface A { a: string; } +>a : string + +export default function() { return 1; } +>1 : 1 + +declare var x: A; +>x : A + diff --git a/tests/cases/compiler/exportDefaultInterfaceAndValue.ts b/tests/cases/compiler/exportDefaultInterfaceAndValue.ts new file mode 100644 index 00000000000..411e5f2706c --- /dev/null +++ b/tests/cases/compiler/exportDefaultInterfaceAndValue.ts @@ -0,0 +1,3 @@ +export default interface A { a: string; } +export default function() { return 1; } +declare var x: A;