From f0896f32ea3d523f1186e9bea2446f75f3a182de Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> Date: Mon, 1 Feb 2021 17:40:57 -0800 Subject: [PATCH] use single, original tuple instead --- src/services/signatureHelp.ts | 23 +++++++------------ src/services/types.ts | 1 - .../signatureHelpLeadingRestTuple.ts | 22 ++++++++---------- 3 files changed, 17 insertions(+), 29 deletions(-) diff --git a/src/services/signatureHelp.ts b/src/services/signatureHelp.ts index c5a41195130..d7f964660e7 100644 --- a/src/services/signatureHelp.ts +++ b/src/services/signatureHelp.ts @@ -540,15 +540,7 @@ namespace ts.SignatureHelp { } Debug.assert(selectedItemIndex !== -1); // If candidates is non-empty it should always include bestSignature. We check for an empty candidates before calling this function. - const help = { items: flatMapToMutable(items, identity), applicableSpan, selectedItemIndex, argumentIndex, argumentCount }; - const selected = help.items[selectedItemIndex]; - if (selected.isVariadic) { - const firstRest = findIndex(selected.parameters, p => !!p.isRest); - if (firstRest > -1 && help.argumentIndex > firstRest) { - help.argumentIndex = firstRest; - } - } - return help; + return { items: flatMapToMutable(items, identity), applicableSpan, selectedItemIndex, argumentIndex, argumentCount }; } function createTypeHelpItems( @@ -628,10 +620,12 @@ namespace ts.SignatureHelp { printer.writeList(ListFormat.TypeParameters, args, sourceFile, writer); } }); - const lists = checker.getExpandedParameters(candidateSignature); - return lists.map(parameterList => { + const expansions = checker.getExpandedParameters(candidateSignature); + const hasNonTrailingRest = expansions.some(e => e.some((p,i) => (p as TransientSymbol).checkFlags & CheckFlags.RestParameter && i !== e.length - 1)); + const hasTupleExpansion = expansions.length > 1; + return (hasNonTrailingRest ? [candidateSignature.parameters] : expansions).map(parameterList => { return { - isVariadic: isVariadic && (lists.length === 1 || !!((parameterList[parameterList.length - 1] as TransientSymbol).checkFlags & CheckFlags.RestParameter)), + isVariadic: isVariadic && (!hasTupleExpansion || !!((parameterList[parameterList.length - 1] as TransientSymbol).checkFlags & CheckFlags.RestParameter)), parameters: parameterList.map(p => createSignatureHelpParameterForParameter(p, checker, enclosingDeclaration, sourceFile, printer)), prefix: [...typeParameterParts, punctuationPart(SyntaxKind.OpenParenToken)], suffix: [punctuationPart(SyntaxKind.CloseParenToken)] @@ -645,8 +639,7 @@ namespace ts.SignatureHelp { printer.writeNode(EmitHint.Unspecified, param, sourceFile, writer); }); const isOptional = checker.isOptionalParameter(parameter.valueDeclaration as ParameterDeclaration); - const isRest = !!((parameter as TransientSymbol).checkFlags & CheckFlags.RestParameter); - return { name: parameter.name, documentation: parameter.getDocumentationComment(checker), displayParts, isOptional, isRest }; + return { name: parameter.name, documentation: parameter.getDocumentationComment(checker), displayParts, isOptional }; } function createSignatureHelpParameterForTypeParameter(typeParameter: TypeParameter, checker: TypeChecker, enclosingDeclaration: Node, sourceFile: SourceFile, printer: Printer): SignatureHelpParameter { @@ -654,6 +647,6 @@ namespace ts.SignatureHelp { const param = checker.typeParameterToDeclaration(typeParameter, enclosingDeclaration, signatureHelpNodeBuilderFlags)!; printer.writeNode(EmitHint.Unspecified, param, sourceFile, writer); }); - return { name: typeParameter.symbol.name, documentation: typeParameter.symbol.getDocumentationComment(checker), displayParts, isOptional: false, isRest: false }; + return { name: typeParameter.symbol.name, documentation: typeParameter.symbol.getDocumentationComment(checker), displayParts, isOptional: false }; } } diff --git a/src/services/types.ts b/src/services/types.ts index f1ca5f73727..dd97197a924 100644 --- a/src/services/types.ts +++ b/src/services/types.ts @@ -1078,7 +1078,6 @@ namespace ts { documentation: SymbolDisplayPart[]; displayParts: SymbolDisplayPart[]; isOptional: boolean; - isRest?: boolean; } export interface SelectionRange { diff --git a/tests/cases/fourslash/signatureHelpLeadingRestTuple.ts b/tests/cases/fourslash/signatureHelpLeadingRestTuple.ts index 5d6fc0056ff..7534a386b71 100644 --- a/tests/cases/fourslash/signatureHelpLeadingRestTuple.ts +++ b/tests/cases/fourslash/signatureHelpLeadingRestTuple.ts @@ -1,6 +1,6 @@ /// -////export function leading(...args: [...names: string[], allCaps: boolean]): void { +////export function leading(...args: [...names: string[], x: boolean, y: number]): void { ////} //// ////leading(/*1*/); @@ -10,29 +10,25 @@ verify.signatureHelp( { marker: "1", - text: "leading(...names: string[], allCaps: boolean): void", + text: "leading(...args: [...names: string[], x: boolean, y: number]): void", overloadsCount: 1, - parameterCount: 2, - parameterName: "names", - parameterSpan: "...names: string[]", + parameterCount: 1, + parameterName: "args", + parameterSpan: "...args: [...names: string[], x: boolean, y: number]", isVariadic: true, }, { marker: "2", - text: "leading(...names: string[], allCaps: boolean): void", + text: "leading(...args: [...names: string[], x: boolean, y: number]): void", overloadsCount: 1, - parameterCount: 2, - parameterName: "names", - parameterSpan: "...names: string[]", + parameterCount: 1, isVariadic: true, }, { marker: "3", - text: "leading(...names: string[], allCaps: boolean): void", + text: "leading(...args: [...names: string[], x: boolean, y: number]): void", overloadsCount: 1, - parameterCount: 2, - parameterName: "names", - parameterSpan: "...names: string[]", + parameterCount: 1, isVariadic: true, }, );