Skip to content

Commit 3e91592

Browse files
Andaristsandersn
andauthored
Fixed an out-of-order quick info issue with contextual rest parameter (#57580)
Co-authored-by: Nathan Shively-Sanders <[email protected]>
1 parent 9bdfa44 commit 3e91592

File tree

3 files changed

+21
-13
lines changed

3 files changed

+21
-13
lines changed

src/compiler/checker.ts

+12-7
Original file line numberDiff line numberDiff line change
@@ -15122,11 +15122,17 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1512215122
return symbol && withAugmentations ? getMergedSymbol(symbol) : symbol;
1512315123
}
1512415124

15125+
function hasEffectiveQuestionToken(node: ParameterDeclaration | JSDocParameterTag | JSDocPropertyTag) {
15126+
return hasQuestionToken(node) || isOptionalJSDocPropertyLikeTag(node) || isParameter(node) && isJSDocOptionalParameter(node);
15127+
}
15128+
1512515129
function isOptionalParameter(node: ParameterDeclaration | JSDocParameterTag | JSDocPropertyTag) {
15126-
if (hasQuestionToken(node) || isOptionalJSDocPropertyLikeTag(node) || isJSDocOptionalParameter(node)) {
15130+
if (hasEffectiveQuestionToken(node)) {
1512715131
return true;
1512815132
}
15129-
15133+
if (!isParameter(node)) {
15134+
return false;
15135+
}
1513015136
if (node.initializer) {
1513115137
const signature = getSignatureFromDeclaration(node.parent);
1513215138
const parameterIndex = node.parent.parameters.indexOf(node);
@@ -15256,10 +15262,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1525615262
}
1525715263

1525815264
// Record a new minimum argument count if this is not an optional parameter
15259-
const isOptionalParameter = isOptionalJSDocPropertyLikeTag(param) ||
15260-
param.initializer || param.questionToken || isRestParameter(param) ||
15261-
iife && parameters.length > iife.arguments.length && !type ||
15262-
isJSDocOptionalParameter(param);
15265+
const isOptionalParameter = hasEffectiveQuestionToken(param) ||
15266+
isParameter(param) && param.initializer || isRestParameter(param) ||
15267+
iife && parameters.length > iife.arguments.length && !type;
1526315268
if (!isOptionalParameter) {
1526415269
minArgumentCount = parameters.length;
1526515270
}
@@ -49601,7 +49606,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4960149606
return grammarErrorOnNode(parameter.name, Diagnostics.A_rest_parameter_cannot_have_an_initializer);
4960249607
}
4960349608
}
49604-
else if (isOptionalParameter(parameter)) {
49609+
else if (hasEffectiveQuestionToken(parameter)) {
4960549610
seenOptionalParameter = true;
4960649611
if (parameter.questionToken && parameter.initializer) {
4960749612
return grammarErrorOnNode(parameter.name, Diagnostics.Parameter_cannot_have_question_mark_and_initializer);

src/compiler/utilities.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,6 @@ import {
357357
JSDocMemberName,
358358
JSDocOverloadTag,
359359
JSDocParameterTag,
360-
JSDocPropertyLikeTag,
361360
JSDocSatisfiesExpression,
362361
JSDocSatisfiesTag,
363362
JSDocSignature,
@@ -10485,7 +10484,7 @@ export function canHaveExportModifier(node: Node): node is Extract<HasModifiers,
1048510484
}
1048610485

1048710486
/** @internal */
10488-
export function isOptionalJSDocPropertyLikeTag(node: Node): node is JSDocPropertyLikeTag {
10487+
export function isOptionalJSDocPropertyLikeTag(node: Node): boolean {
1048910488
if (!isJSDocPropertyLikeTag(node)) {
1049010489
return false;
1049110490
}
@@ -10514,7 +10513,7 @@ export function isJSDocOptionalParameter(node: ParameterDeclaration) {
1051410513
return isInJSFile(node) && (
1051510514
// node.type should only be a JSDocOptionalType when node is a parameter of a JSDocFunctionType
1051610515
node.type && node.type.kind === SyntaxKind.JSDocOptionalType
10517-
|| getJSDocParameterTags(node).some(({ isBracketed, typeExpression }) => isBracketed || !!typeExpression && typeExpression.type.kind === SyntaxKind.JSDocOptionalType)
10516+
|| getJSDocParameterTags(node).some(isOptionalJSDocPropertyLikeTag)
1051810517
);
1051910518
}
1052010519

tests/baselines/reference/completionDetailsOfContextSensitiveParameterNoCrash.baseline

+7-3
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@
8585
// return curry(getStylingByKeys, 2)(mergedStyling, ...args);
8686
// ^^^^
8787
// | ----------------------------------------------------------------------
88-
// | (parameter) args: any
88+
// | (parameter) args: []
8989
// | ----------------------------------------------------------------------
9090
// },
9191
// 3
@@ -135,8 +135,12 @@
135135
"kind": "space"
136136
},
137137
{
138-
"text": "any",
139-
"kind": "keyword"
138+
"text": "[",
139+
"kind": "punctuation"
140+
},
141+
{
142+
"text": "]",
143+
"kind": "punctuation"
140144
}
141145
],
142146
"documentation": []

0 commit comments

Comments
 (0)