From f37101e8719a16145fb0a2cee4d4690307870d4c Mon Sep 17 00:00:00 2001 From: Andy Date: Mon, 5 Nov 2018 12:57:33 -0800 Subject: [PATCH] Fix bug when augmenting parent-less symbol (#28345) --- src/compiler/checker.ts | 2 +- .../reference/moduleAugmentationOfAlias.js | 31 ++++++++++++++++++ .../moduleAugmentationOfAlias.symbols | 32 +++++++++++++++++++ .../reference/moduleAugmentationOfAlias.types | 28 ++++++++++++++++ .../compiler/moduleAugmentationOfAlias.ts | 15 +++++++++ 5 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/moduleAugmentationOfAlias.js create mode 100644 tests/baselines/reference/moduleAugmentationOfAlias.symbols create mode 100644 tests/baselines/reference/moduleAugmentationOfAlias.types create mode 100644 tests/cases/compiler/moduleAugmentationOfAlias.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index e17b38ff73..d92d32116f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -26751,7 +26751,7 @@ namespace ts { let reportError = !(symbol.flags & SymbolFlags.Transient); if (!reportError) { // symbol should not originate in augmentation - reportError = isExternalModuleAugmentation(symbol.parent!.declarations[0]); + reportError = !!symbol.parent && isExternalModuleAugmentation(symbol.parent.declarations[0]); } } break; diff --git a/tests/baselines/reference/moduleAugmentationOfAlias.js b/tests/baselines/reference/moduleAugmentationOfAlias.js new file mode 100644 index 0000000000..1b77eeeec1 --- /dev/null +++ b/tests/baselines/reference/moduleAugmentationOfAlias.js @@ -0,0 +1,31 @@ +//// [tests/cases/compiler/moduleAugmentationOfAlias.ts] //// + +//// [a.ts] +interface I {} +export default I; + +//// [b.ts] +export {}; +declare module './a' { + export default interface I { x: number; } +} + +//// [c.ts] +import I from "./a"; +function f(i: I) { + i.x; +} + + +//// [a.js] +"use strict"; +exports.__esModule = true; +//// [b.js] +"use strict"; +exports.__esModule = true; +//// [c.js] +"use strict"; +exports.__esModule = true; +function f(i) { + i.x; +} diff --git a/tests/baselines/reference/moduleAugmentationOfAlias.symbols b/tests/baselines/reference/moduleAugmentationOfAlias.symbols new file mode 100644 index 0000000000..8bdf13c539 --- /dev/null +++ b/tests/baselines/reference/moduleAugmentationOfAlias.symbols @@ -0,0 +1,32 @@ +=== /a.ts === +interface I {} +>I : Symbol(I, Decl(a.ts, 0, 0), Decl(b.ts, 1, 22)) + +export default I; +>I : Symbol(I, Decl(a.ts, 0, 0)) + +=== /b.ts === +export {}; +declare module './a' { +>'./a' : Symbol("/a", Decl(a.ts, 0, 0), Decl(b.ts, 0, 10)) + + export default interface I { x: number; } +>I : Symbol(I, Decl(a.ts, 0, 0), Decl(b.ts, 1, 22)) +>x : Symbol(I.x, Decl(b.ts, 2, 32)) +} + +=== /c.ts === +import I from "./a"; +>I : Symbol(I, Decl(c.ts, 0, 6)) + +function f(i: I) { +>f : Symbol(f, Decl(c.ts, 0, 20)) +>i : Symbol(i, Decl(c.ts, 1, 11)) +>I : Symbol(I, Decl(c.ts, 0, 6)) + + i.x; +>i.x : Symbol(I.x, Decl(b.ts, 2, 32)) +>i : Symbol(i, Decl(c.ts, 1, 11)) +>x : Symbol(I.x, Decl(b.ts, 2, 32)) +} + diff --git a/tests/baselines/reference/moduleAugmentationOfAlias.types b/tests/baselines/reference/moduleAugmentationOfAlias.types new file mode 100644 index 0000000000..a5112f5869 --- /dev/null +++ b/tests/baselines/reference/moduleAugmentationOfAlias.types @@ -0,0 +1,28 @@ +=== /a.ts === +interface I {} +export default I; +>I : I + +=== /b.ts === +export {}; +declare module './a' { +>'./a' : typeof import("/a") + + export default interface I { x: number; } +>x : number +} + +=== /c.ts === +import I from "./a"; +>I : any + +function f(i: I) { +>f : (i: I) => void +>i : I + + i.x; +>i.x : number +>i : I +>x : number +} + diff --git a/tests/cases/compiler/moduleAugmentationOfAlias.ts b/tests/cases/compiler/moduleAugmentationOfAlias.ts new file mode 100644 index 0000000000..d9014033d5 --- /dev/null +++ b/tests/cases/compiler/moduleAugmentationOfAlias.ts @@ -0,0 +1,15 @@ +// @Filename: /a.ts +interface I {} +export default I; + +// @Filename: /b.ts +export {}; +declare module './a' { + export default interface I { x: number; } +} + +// @Filename: /c.ts +import I from "./a"; +function f(i: I) { + i.x; +}