From d85df9e9faa807f8481c88d4babb77e1e7d9ed72 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Tue, 22 Jul 2014 10:54:20 -0700 Subject: [PATCH] Addressing CR feedback. Adding comment to explain source type instantiation. Adding a test case. --- src/compiler/checker.ts | 1 + .../contextualSignatureInstantiation3.js | 42 +++++++++++++++++++ .../contextualSignatureInstantiation3.ts | 22 ++++++++++ 3 files changed, 65 insertions(+) create mode 100644 tests/baselines/reference/contextualSignatureInstantiation3.js create mode 100644 tests/cases/compiler/contextualSignatureInstantiation3.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 792dc64a1b9..aa457833175 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -3675,6 +3675,7 @@ module ts { function instantiateSignatureInContextOf(signature: Signature, contextualSignature: Signature, contextualMapper: TypeMapper): Signature { var context = createInferenceContext(signature.typeParameters); forEachMatchingParameterType(contextualSignature, signature, (source, target) => { + // Type parameters from outer context referenced by source type are fixed by instantiation of the source type inferTypes(context, instantiateType(source, contextualMapper), target); }); return getSignatureInstantiation(signature, getInferredTypes(context)); diff --git a/tests/baselines/reference/contextualSignatureInstantiation3.js b/tests/baselines/reference/contextualSignatureInstantiation3.js new file mode 100644 index 00000000000..44737476482 --- /dev/null +++ b/tests/baselines/reference/contextualSignatureInstantiation3.js @@ -0,0 +1,42 @@ +//// [contextualSignatureInstantiation3.ts] +function map(items: T[], f: (x: T) => U): U[]{ + return items.map(f); +} + +function identity(x: T) { + return x; +} + +function singleton(x: T) { + return [x]; +} + +var xs = [1, 2, 3]; + +// Have compiler check that we get the correct types +var v1: number[]; +var v1 = xs.map(identity); // Error if not number[] +var v1 = map(xs, identity); // Error if not number[] + +var v2: number[][]; +var v2 = xs.map(singleton); // Error if not number[][] +var v2 = map(xs, singleton); // Error if not number[][] + + +//// [contextualSignatureInstantiation3.js] +function map(items, f) { + return items.map(f); +} +function identity(x) { + return x; +} +function singleton(x) { + return [x]; +} +var xs = [1, 2, 3]; +var v1; +var v1 = xs.map(identity); +var v1 = map(xs, identity); +var v2; +var v2 = xs.map(singleton); +var v2 = map(xs, singleton); diff --git a/tests/cases/compiler/contextualSignatureInstantiation3.ts b/tests/cases/compiler/contextualSignatureInstantiation3.ts new file mode 100644 index 00000000000..a71f08d209d --- /dev/null +++ b/tests/cases/compiler/contextualSignatureInstantiation3.ts @@ -0,0 +1,22 @@ +function map(items: T[], f: (x: T) => U): U[]{ + return items.map(f); +} + +function identity(x: T) { + return x; +} + +function singleton(x: T) { + return [x]; +} + +var xs = [1, 2, 3]; + +// Have compiler check that we get the correct types +var v1: number[]; +var v1 = xs.map(identity); // Error if not number[] +var v1 = map(xs, identity); // Error if not number[] + +var v2: number[][]; +var v2 = xs.map(singleton); // Error if not number[][] +var v2 = map(xs, singleton); // Error if not number[][]