Skip to content

Commit a47e02a

Browse files
committed
Adjust notion of minArgumentCount to account for required parameters with default initializers
1 parent aac3451 commit a47e02a

3 files changed

Lines changed: 36 additions & 9 deletions

File tree

src/compiler/checker.ts

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3517,7 +3517,19 @@ namespace ts {
35173517
}
35183518

35193519
function isOptionalParameter(node: ParameterDeclaration) {
3520-
return hasQuestionToken(node) || !!node.initializer;
3520+
if (hasQuestionToken(node)) {
3521+
return true;
3522+
}
3523+
3524+
if (node.initializer) {
3525+
let signatureDeclaration = <SignatureDeclaration>node.parent;
3526+
let signature = getSignatureFromDeclaration(signatureDeclaration);
3527+
let parameterIndex = signatureDeclaration.parameters.indexOf(node);
3528+
Debug.assert(parameterIndex >= 0);
3529+
return parameterIndex >= signature.minArgumentCount;
3530+
}
3531+
3532+
return false;
35213533
}
35223534

35233535
function getSignatureFromDeclaration(declaration: SignatureDeclaration): Signature {
@@ -3535,11 +3547,16 @@ namespace ts {
35353547
if (param.type && param.type.kind === SyntaxKind.StringLiteral) {
35363548
hasStringLiterals = true;
35373549
}
3538-
if (minArgumentCount < 0) {
3539-
if (param.initializer || param.questionToken || param.dotDotDotToken) {
3550+
3551+
if (param.initializer || param.questionToken || param.dotDotDotToken) {
3552+
if (minArgumentCount < 0) {
35403553
minArgumentCount = i;
35413554
}
35423555
}
3556+
else {
3557+
// If we see any required parameters, it means the prior ones were not in fact optional.
3558+
minArgumentCount = -1;
3559+
}
35433560
}
35443561

35453562
if (minArgumentCount < 0) {

src/compiler/utilities.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -988,15 +988,13 @@ namespace ts {
988988
if (node) {
989989
switch (node.kind) {
990990
case SyntaxKind.Parameter:
991-
return (<ParameterDeclaration>node).questionToken !== undefined;
992991
case SyntaxKind.MethodDeclaration:
993992
case SyntaxKind.MethodSignature:
994-
return (<MethodDeclaration>node).questionToken !== undefined;
995993
case SyntaxKind.ShorthandPropertyAssignment:
996994
case SyntaxKind.PropertyAssignment:
997995
case SyntaxKind.PropertyDeclaration:
998996
case SyntaxKind.PropertySignature:
999-
return (<PropertyDeclaration>node).questionToken !== undefined;
997+
return (<ParameterDeclaration | MethodDeclaration | PropertyDeclaration>node).questionToken !== undefined;
1000998
}
1001999
}
10021000

src/services/signatureHelp.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,15 @@ namespace ts.SignatureHelp {
569569
prefixDisplayParts.push(punctuationPart(SyntaxKind.OpenParenToken));
570570

571571
let parameters = candidateSignature.parameters;
572-
signatureHelpParameters = parameters.length > 0 ? map(parameters, createSignatureHelpParameterForParameter) : emptyArray;
572+
if (parameters.length > 0) {
573+
signatureHelpParameters = [];
574+
for (let i = 0; i < parameters.length; i++) {
575+
signatureHelpParameters.push(createSignatureHelpParameterAtIndex(candidateSignature, i));
576+
}
577+
}
578+
else {
579+
signatureHelpParameters = emptyArray;
580+
}
573581
suffixDisplayParts.push(punctuationPart(SyntaxKind.CloseParenToken));
574582
}
575583

@@ -607,11 +615,15 @@ namespace ts.SignatureHelp {
607615
argumentCount
608616
};
609617

610-
function createSignatureHelpParameterForParameter(parameter: Symbol): SignatureHelpParameter {
618+
function createSignatureHelpParameterAtIndex(signature: Signature, parameterIndex: number): SignatureHelpParameter {
619+
let parameter = signature.parameters[parameterIndex];
611620
let displayParts = mapToDisplayParts(writer =>
612621
typeChecker.getSymbolDisplayBuilder().buildParameterDisplay(parameter, writer, invocation));
613622

614-
let isOptional = hasQuestionToken(parameter.valueDeclaration);
623+
let parameterDeclaration = <ParameterDeclaration>parameter.valueDeclaration;
624+
let isOptional =
625+
hasQuestionToken(parameterDeclaration) ||
626+
parameterDeclaration.initializer && parameterIndex >= signature.minArgumentCount;
615627

616628
return {
617629
name: parameter.name,

0 commit comments

Comments
 (0)