From 3bdfd8f4774830a5fbf6f0dcc45e27e17d9b63c8 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Fri, 20 May 2016 10:59:05 -0700 Subject: [PATCH 1/2] Make sure to instantiate merged type parameters --- src/compiler/checker.ts | 2 +- .../reference/instantiateCrossFileMerge.js | 15 +++++++++++ .../instantiateCrossFileMerge.symbols | 22 ++++++++++++++++ .../reference/instantiateCrossFileMerge.types | 26 +++++++++++++++++++ .../compiler/instantiateCrossFileMerge.ts | 8 ++++++ 5 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/instantiateCrossFileMerge.js create mode 100644 tests/baselines/reference/instantiateCrossFileMerge.symbols create mode 100644 tests/baselines/reference/instantiateCrossFileMerge.types create mode 100644 tests/cases/compiler/instantiateCrossFileMerge.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 476695e3ec..bf8eb1a2c3 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5464,7 +5464,7 @@ namespace ts { const declaration = node; if (declaration.typeParameters) { for (const d of declaration.typeParameters) { - if (contains(mappedTypes, getDeclaredTypeOfTypeParameter(d.symbol))) { + if (contains(mappedTypes, getDeclaredTypeOfTypeParameter(getMergedSymbol(d.symbol)))) { return true; } } diff --git a/tests/baselines/reference/instantiateCrossFileMerge.js b/tests/baselines/reference/instantiateCrossFileMerge.js new file mode 100644 index 0000000000..cf452b599b --- /dev/null +++ b/tests/baselines/reference/instantiateCrossFileMerge.js @@ -0,0 +1,15 @@ +//// [tests/cases/compiler/instantiateCrossFileMerge.ts] //// + +//// [first.ts] +declare class P { + constructor(callback: (resolve: (value: R) => void) => void); +} + +//// [second.ts] +interface P { } +new P(r => { r('foo') }); + + +//// [first.js] +//// [second.js] +new P(function (r) { r('foo'); }); diff --git a/tests/baselines/reference/instantiateCrossFileMerge.symbols b/tests/baselines/reference/instantiateCrossFileMerge.symbols new file mode 100644 index 0000000000..64f9586f48 --- /dev/null +++ b/tests/baselines/reference/instantiateCrossFileMerge.symbols @@ -0,0 +1,22 @@ +=== tests/cases/compiler/first.ts === +declare class P { +>P : Symbol(P, Decl(first.ts, 0, 0), Decl(second.ts, 0, 0)) +>R : Symbol(R, Decl(first.ts, 0, 16), Decl(second.ts, 0, 12)) + + constructor(callback: (resolve: (value: R) => void) => void); +>callback : Symbol(callback, Decl(first.ts, 1, 16)) +>resolve : Symbol(resolve, Decl(first.ts, 1, 27)) +>value : Symbol(value, Decl(first.ts, 1, 37)) +>R : Symbol(R, Decl(first.ts, 0, 16), Decl(second.ts, 0, 12)) +} + +=== tests/cases/compiler/second.ts === +interface P { } +>P : Symbol(P, Decl(first.ts, 0, 0), Decl(second.ts, 0, 0)) +>R : Symbol(R, Decl(first.ts, 0, 16), Decl(second.ts, 0, 12)) + +new P(r => { r('foo') }); +>P : Symbol(P, Decl(first.ts, 0, 0), Decl(second.ts, 0, 0)) +>r : Symbol(r, Decl(second.ts, 1, 14)) +>r : Symbol(r, Decl(second.ts, 1, 14)) + diff --git a/tests/baselines/reference/instantiateCrossFileMerge.types b/tests/baselines/reference/instantiateCrossFileMerge.types new file mode 100644 index 0000000000..8fbeaab3d1 --- /dev/null +++ b/tests/baselines/reference/instantiateCrossFileMerge.types @@ -0,0 +1,26 @@ +=== tests/cases/compiler/first.ts === +declare class P { +>P : P +>R : R + + constructor(callback: (resolve: (value: R) => void) => void); +>callback : (resolve: (value: R) => void) => void +>resolve : (value: R) => void +>value : R +>R : R +} + +=== tests/cases/compiler/second.ts === +interface P { } +>P : P +>R : R + +new P(r => { r('foo') }); +>new P(r => { r('foo') }) : P +>P : typeof P +>r => { r('foo') } : (r: (value: string) => void) => void +>r : (value: string) => void +>r('foo') : void +>r : (value: string) => void +>'foo' : string + diff --git a/tests/cases/compiler/instantiateCrossFileMerge.ts b/tests/cases/compiler/instantiateCrossFileMerge.ts new file mode 100644 index 0000000000..00f5ce22fa --- /dev/null +++ b/tests/cases/compiler/instantiateCrossFileMerge.ts @@ -0,0 +1,8 @@ +// @filename: first.ts +declare class P { + constructor(callback: (resolve: (value: R) => void) => void); +} + +// @filename: second.ts +interface P { } +new P(r => { r('foo') }); From 7562ef033e6c2b67231a2d6c8d132948532772a2 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Fri, 20 May 2016 12:53:44 -0700 Subject: [PATCH 2/2] Use `getSymbolOfNode` instead of `getMergedSymbol` --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index bf8eb1a2c3..27d419b7eb 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5464,7 +5464,7 @@ namespace ts { const declaration = node; if (declaration.typeParameters) { for (const d of declaration.typeParameters) { - if (contains(mappedTypes, getDeclaredTypeOfTypeParameter(getMergedSymbol(d.symbol)))) { + if (contains(mappedTypes, getDeclaredTypeOfTypeParameter(getSymbolOfNode(d)))) { return true; } }