From 96d3db212e274f31f2ec36f5d082ebadf910b348 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Thu, 5 May 2016 18:00:12 -0700 Subject: [PATCH] Only contextually type expressions of calls Also allocate once instead of twice. --- src/compiler/checker.ts | 14 +++++++--- .../reference/contextuallyTypedIife.types | 26 +++++++++---------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c3dff2371e..0f392efce1 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8525,9 +8525,13 @@ namespace ts { const indexOfParameter = indexOf(func.parameters, parameter); if (iife.arguments && indexOfParameter < iife.arguments.length) { if (parameter.dotDotDotToken) { - return createArrayType(getUnionType(map(iife.arguments.slice(indexOfParameter), getTypeOfExpression))); + const restTypes: Type[] = []; + for (let i = indexOfParameter; i < iife.arguments.length; i++) { + restTypes.push(getTypeOfExpression(iife.arguments[i])); + } + return createArrayType(getUnionType(restTypes)); } - return checkExpression(iife.arguments[indexOfParameter], identityMapper); + return checkExpression(iife.arguments[indexOfParameter]); } } const contextualSignature = getContextualSignature(func); @@ -8552,11 +8556,13 @@ namespace ts { function getImmediatelyInvokedFunctionExpression(func: FunctionExpression | MethodDeclaration) { if (isFunctionExpressionOrArrowFunction(func)) { - let parent = func.parent; + let prev: Node = func; + let parent: Node = func.parent; while (parent.kind === SyntaxKind.ParenthesizedExpression) { + prev = parent; parent = parent.parent; } - if (parent.kind === SyntaxKind.CallExpression) { + if (parent.kind === SyntaxKind.CallExpression && (parent as CallExpression).expression === prev) { return parent as CallExpression; } } diff --git a/tests/baselines/reference/contextuallyTypedIife.types b/tests/baselines/reference/contextuallyTypedIife.types index b673927e17..0f2092ef7c 100644 --- a/tests/baselines/reference/contextuallyTypedIife.types +++ b/tests/baselines/reference/contextuallyTypedIife.types @@ -223,26 +223,26 @@ let twelve = (f => f(12))(i => i); >twelve : any >(f => f(12))(i => i) : any ->(f => f(12)) : (f: {}) => any ->f => f(12) : (f: {}) => any ->f : {} +>(f => f(12)) : (f: (i: any) => any) => any +>f => f(12) : (f: (i: any) => any) => any +>f : (i: any) => any >f(12) : any ->f : {} +>f : (i: any) => any >12 : number ->i => i : (i: {}) => {} ->i : {} ->i : {} +>i => i : (i: any) => any +>i : any +>i : any let eleven = (o => o.a(11))({ a: function(n) { return n; } }); >eleven : any >(o => o.a(11))({ a: function(n) { return n; } }) : any ->(o => o.a(11)) : (o: { a: {}; }) => any ->o => o.a(11) : (o: { a: {}; }) => any ->o : { a: {}; } +>(o => o.a(11)) : (o: { a: (n: any) => any; }) => any +>o => o.a(11) : (o: { a: (n: any) => any; }) => any +>o : { a: (n: any) => any; } >o.a(11) : any ->o.a : {} ->o : { a: {}; } ->a : {} +>o.a : (n: any) => any +>o : { a: (n: any) => any; } +>a : (n: any) => any >11 : number >{ a: function(n) { return n; } } : { a: (n: any) => any; } >a : (n: any) => any