Skip to content

Commit 96d3db2

Browse files
committed
Only contextually type expressions of calls
Also allocate once instead of twice.
1 parent b0a387a commit 96d3db2

File tree

2 files changed

+23
-17
lines changed

2 files changed

+23
-17
lines changed

src/compiler/checker.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8525,9 +8525,13 @@ namespace ts {
85258525
const indexOfParameter = indexOf(func.parameters, parameter);
85268526
if (iife.arguments && indexOfParameter < iife.arguments.length) {
85278527
if (parameter.dotDotDotToken) {
8528-
return createArrayType(getUnionType(map(iife.arguments.slice(indexOfParameter), getTypeOfExpression)));
8528+
const restTypes: Type[] = [];
8529+
for (let i = indexOfParameter; i < iife.arguments.length; i++) {
8530+
restTypes.push(getTypeOfExpression(iife.arguments[i]));
8531+
}
8532+
return createArrayType(getUnionType(restTypes));
85298533
}
8530-
return checkExpression(iife.arguments[indexOfParameter], identityMapper);
8534+
return checkExpression(iife.arguments[indexOfParameter]);
85318535
}
85328536
}
85338537
const contextualSignature = getContextualSignature(func);
@@ -8552,11 +8556,13 @@ namespace ts {
85528556

85538557
function getImmediatelyInvokedFunctionExpression(func: FunctionExpression | MethodDeclaration) {
85548558
if (isFunctionExpressionOrArrowFunction(func)) {
8555-
let parent = func.parent;
8559+
let prev: Node = func;
8560+
let parent: Node = func.parent;
85568561
while (parent.kind === SyntaxKind.ParenthesizedExpression) {
8562+
prev = parent;
85578563
parent = parent.parent;
85588564
}
8559-
if (parent.kind === SyntaxKind.CallExpression) {
8565+
if (parent.kind === SyntaxKind.CallExpression && (parent as CallExpression).expression === prev) {
85608566
return parent as CallExpression;
85618567
}
85628568
}

tests/baselines/reference/contextuallyTypedIife.types

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -223,26 +223,26 @@
223223
let twelve = (f => f(12))(i => i);
224224
>twelve : any
225225
>(f => f(12))(i => i) : any
226-
>(f => f(12)) : (f: {}) => any
227-
>f => f(12) : (f: {}) => any
228-
>f : {}
226+
>(f => f(12)) : (f: (i: any) => any) => any
227+
>f => f(12) : (f: (i: any) => any) => any
228+
>f : (i: any) => any
229229
>f(12) : any
230-
>f : {}
230+
>f : (i: any) => any
231231
>12 : number
232-
>i => i : (i: {}) => {}
233-
>i : {}
234-
>i : {}
232+
>i => i : (i: any) => any
233+
>i : any
234+
>i : any
235235

236236
let eleven = (o => o.a(11))({ a: function(n) { return n; } });
237237
>eleven : any
238238
>(o => o.a(11))({ a: function(n) { return n; } }) : any
239-
>(o => o.a(11)) : (o: { a: {}; }) => any
240-
>o => o.a(11) : (o: { a: {}; }) => any
241-
>o : { a: {}; }
239+
>(o => o.a(11)) : (o: { a: (n: any) => any; }) => any
240+
>o => o.a(11) : (o: { a: (n: any) => any; }) => any
241+
>o : { a: (n: any) => any; }
242242
>o.a(11) : any
243-
>o.a : {}
244-
>o : { a: {}; }
245-
>a : {}
243+
>o.a : (n: any) => any
244+
>o : { a: (n: any) => any; }
245+
>a : (n: any) => any
246246
>11 : number
247247
>{ a: function(n) { return n; } } : { a: (n: any) => any; }
248248
>a : (n: any) => any

0 commit comments

Comments
 (0)