Skip to content

Commit 578e7f7

Browse files
committed
Fix the quickInfo for rest parameters
1 parent 7161f5f commit 578e7f7

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

src/compiler/checker.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3876,9 +3876,21 @@ module ts {
38763876
var func = <FunctionDeclaration>parameter.parent;
38773877
if (func.kind === SyntaxKind.FunctionExpression || func.kind === SyntaxKind.ArrowFunction) {
38783878
if (isContextSensitiveExpression(func)) {
3879-
var signature = getContextualSignature(func);
3880-
if (signature) {
3881-
return getTypeAtPosition(signature, indexOf(func.parameters, parameter));
3879+
var contextualSignature = getContextualSignature(func);
3880+
if (contextualSignature) {
3881+
3882+
var funcHasRestParameters = hasRestParameters(func);
3883+
var len = func.parameters.length - (funcHasRestParameters ? 1 : 0);
3884+
var indexOfParameter = indexOf(func.parameters, parameter);
3885+
if (indexOfParameter < len) {
3886+
return getTypeAtPosition(contextualSignature, indexOfParameter);
3887+
}
3888+
3889+
// If last parameter is contextually rest parameter get its type
3890+
if (indexOfParameter === (func.parameters.length - 1) &&
3891+
funcHasRestParameters && contextualSignature.hasRestParameter && func.parameters.length >= contextualSignature.parameters.length) {
3892+
return getTypeOfSymbol(contextualSignature.parameters[contextualSignature.parameters.length - 1]);
3893+
}
38823894
}
38833895
}
38843896
}

tests/cases/fourslash_old/restArgType.ts renamed to tests/cases/fourslash/restArgType.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
////});
2020
////var t1 :(a1: string, a2: string) => void = (.../*t1*/f1) => { } // f1 => any[];
2121
////var t2: (a1: string, ...a2: string[]) => void = (.../*t2*/f1) => { } // f1 => any[];
22-
////var t3: (a1: number, a2: boolean, ...c: string[]) => void = (f1/*t31*/, .../*t32*/f2) => { }; // f1 => number, f2 => any[]
22+
////var t3: (a1: number, a2: boolean, ...c: string[]) => void = (/*t31*/f1, .../*t32*/f2) => { }; // f1 => number, f2 => any[]
2323
////var t4: (...a1: string[]) => void = (.../*t4*/f1) => { }; // f1 => string[]
2424
////var t5: (...a1: string[]) => void = (/*t5*/f1) => { }; // f1 => string
2525
////var t6: (...a1: string[]) => void = (/*t61*/f1, .../*t62*/f2) => { }; // f1 => string, f2 => string[]

0 commit comments

Comments
 (0)