Adjust notion of minArgumentCount to account for required parameters with default initializers

This commit is contained in:
Jason Freeman
2015-07-24 13:59:20 -07:00
parent aac34519d4
commit a47e02aeac
3 changed files with 36 additions and 9 deletions

View File

@@ -3517,7 +3517,19 @@ namespace ts {
}
function isOptionalParameter(node: ParameterDeclaration) {
return hasQuestionToken(node) || !!node.initializer;
if (hasQuestionToken(node)) {
return true;
}
if (node.initializer) {
let signatureDeclaration = <SignatureDeclaration>node.parent;
let signature = getSignatureFromDeclaration(signatureDeclaration);
let parameterIndex = signatureDeclaration.parameters.indexOf(node);
Debug.assert(parameterIndex >= 0);
return parameterIndex >= signature.minArgumentCount;
}
return false;
}
function getSignatureFromDeclaration(declaration: SignatureDeclaration): Signature {
@@ -3535,11 +3547,16 @@ namespace ts {
if (param.type && param.type.kind === SyntaxKind.StringLiteral) {
hasStringLiterals = true;
}
if (minArgumentCount < 0) {
if (param.initializer || param.questionToken || param.dotDotDotToken) {
if (param.initializer || param.questionToken || param.dotDotDotToken) {
if (minArgumentCount < 0) {
minArgumentCount = i;
}
}
else {
// If we see any required parameters, it means the prior ones were not in fact optional.
minArgumentCount = -1;
}
}
if (minArgumentCount < 0) {

View File

@@ -988,15 +988,13 @@ namespace ts {
if (node) {
switch (node.kind) {
case SyntaxKind.Parameter:
return (<ParameterDeclaration>node).questionToken !== undefined;
case SyntaxKind.MethodDeclaration:
case SyntaxKind.MethodSignature:
return (<MethodDeclaration>node).questionToken !== undefined;
case SyntaxKind.ShorthandPropertyAssignment:
case SyntaxKind.PropertyAssignment:
case SyntaxKind.PropertyDeclaration:
case SyntaxKind.PropertySignature:
return (<PropertyDeclaration>node).questionToken !== undefined;
return (<ParameterDeclaration | MethodDeclaration | PropertyDeclaration>node).questionToken !== undefined;
}
}

View File

@@ -569,7 +569,15 @@ namespace ts.SignatureHelp {
prefixDisplayParts.push(punctuationPart(SyntaxKind.OpenParenToken));
let parameters = candidateSignature.parameters;
signatureHelpParameters = parameters.length > 0 ? map(parameters, createSignatureHelpParameterForParameter) : emptyArray;
if (parameters.length > 0) {
signatureHelpParameters = [];
for (let i = 0; i < parameters.length; i++) {
signatureHelpParameters.push(createSignatureHelpParameterAtIndex(candidateSignature, i));
}
}
else {
signatureHelpParameters = emptyArray;
}
suffixDisplayParts.push(punctuationPart(SyntaxKind.CloseParenToken));
}
@@ -607,11 +615,15 @@ namespace ts.SignatureHelp {
argumentCount
};
function createSignatureHelpParameterForParameter(parameter: Symbol): SignatureHelpParameter {
function createSignatureHelpParameterAtIndex(signature: Signature, parameterIndex: number): SignatureHelpParameter {
let parameter = signature.parameters[parameterIndex];
let displayParts = mapToDisplayParts(writer =>
typeChecker.getSymbolDisplayBuilder().buildParameterDisplay(parameter, writer, invocation));
let isOptional = hasQuestionToken(parameter.valueDeclaration);
let parameterDeclaration = <ParameterDeclaration>parameter.valueDeclaration;
let isOptional =
hasQuestionToken(parameterDeclaration) ||
parameterDeclaration.initializer && parameterIndex >= signature.minArgumentCount;
return {
name: parameter.name,