mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-11 06:02:53 -05:00
Adjust notion of minArgumentCount to account for required parameters with default initializers
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user