From 3e91592b06096e1cfdc6eb05a95838831e547e22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Tue, 12 Mar 2024 14:17:01 +0100 Subject: [PATCH] Fixed an out-of-order quick info issue with contextual rest parameter (#57580) Co-authored-by: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> --- src/compiler/checker.ts | 19 ++++++++++++------- src/compiler/utilities.ts | 5 ++--- ...fContextSensitiveParameterNoCrash.baseline | 10 +++++++--- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 4f4b45fa0eb43..820da4b78314a 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -15122,11 +15122,17 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return symbol && withAugmentations ? getMergedSymbol(symbol) : symbol; } + function hasEffectiveQuestionToken(node: ParameterDeclaration | JSDocParameterTag | JSDocPropertyTag) { + return hasQuestionToken(node) || isOptionalJSDocPropertyLikeTag(node) || isParameter(node) && isJSDocOptionalParameter(node); + } + function isOptionalParameter(node: ParameterDeclaration | JSDocParameterTag | JSDocPropertyTag) { - if (hasQuestionToken(node) || isOptionalJSDocPropertyLikeTag(node) || isJSDocOptionalParameter(node)) { + if (hasEffectiveQuestionToken(node)) { return true; } - + if (!isParameter(node)) { + return false; + } if (node.initializer) { const signature = getSignatureFromDeclaration(node.parent); const parameterIndex = node.parent.parameters.indexOf(node); @@ -15256,10 +15262,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } // Record a new minimum argument count if this is not an optional parameter - const isOptionalParameter = isOptionalJSDocPropertyLikeTag(param) || - param.initializer || param.questionToken || isRestParameter(param) || - iife && parameters.length > iife.arguments.length && !type || - isJSDocOptionalParameter(param); + const isOptionalParameter = hasEffectiveQuestionToken(param) || + isParameter(param) && param.initializer || isRestParameter(param) || + iife && parameters.length > iife.arguments.length && !type; if (!isOptionalParameter) { minArgumentCount = parameters.length; } @@ -49601,7 +49606,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { return grammarErrorOnNode(parameter.name, Diagnostics.A_rest_parameter_cannot_have_an_initializer); } } - else if (isOptionalParameter(parameter)) { + else if (hasEffectiveQuestionToken(parameter)) { seenOptionalParameter = true; if (parameter.questionToken && parameter.initializer) { return grammarErrorOnNode(parameter.name, Diagnostics.Parameter_cannot_have_question_mark_and_initializer); diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 6bbc51a4ad121..68870769a8fa4 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -357,7 +357,6 @@ import { JSDocMemberName, JSDocOverloadTag, JSDocParameterTag, - JSDocPropertyLikeTag, JSDocSatisfiesExpression, JSDocSatisfiesTag, JSDocSignature, @@ -10485,7 +10484,7 @@ export function canHaveExportModifier(node: Node): node is Extract isBracketed || !!typeExpression && typeExpression.type.kind === SyntaxKind.JSDocOptionalType) + || getJSDocParameterTags(node).some(isOptionalJSDocPropertyLikeTag) ); } diff --git a/tests/baselines/reference/completionDetailsOfContextSensitiveParameterNoCrash.baseline b/tests/baselines/reference/completionDetailsOfContextSensitiveParameterNoCrash.baseline index cecf5e4f9d7e4..0639061cb4935 100644 --- a/tests/baselines/reference/completionDetailsOfContextSensitiveParameterNoCrash.baseline +++ b/tests/baselines/reference/completionDetailsOfContextSensitiveParameterNoCrash.baseline @@ -85,7 +85,7 @@ // return curry(getStylingByKeys, 2)(mergedStyling, ...args); // ^^^^ // | ---------------------------------------------------------------------- -// | (parameter) args: any +// | (parameter) args: [] // | ---------------------------------------------------------------------- // }, // 3 @@ -135,8 +135,12 @@ "kind": "space" }, { - "text": "any", - "kind": "keyword" + "text": "[", + "kind": "punctuation" + }, + { + "text": "]", + "kind": "punctuation" } ], "documentation": []