From 5571c7436e2ad87f6b6cc8fa4ecfb6653f328532 Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Sat, 22 Jun 2019 11:30:01 +0300 Subject: [PATCH] Improved parameter names for call signatures resulting from unions when only one parameter name is available. --- src/compiler/checker.ts | 17 ++++++++++++----- ...lledUnionsOfDissimilarTyeshaveGoodDisplay.ts | 12 ++++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index b5baa61172988..0dce88f89a3e1 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7117,9 +7117,11 @@ namespace ts { } function combineUnionParameters(left: Signature, right: Signature) { - const longest = getParameterCount(left) >= getParameterCount(right) ? left : right; + const leftCount = getParameterCount(left); + const rightCount = getParameterCount(right); + const longest = leftCount >= rightCount ? left : right; const shorter = longest === left ? right : left; - const longestCount = getParameterCount(longest); + const longestCount = longest === left ? leftCount : rightCount; const eitherHasEffectiveRest = (hasEffectiveRestParameter(left) || hasEffectiveRestParameter(right)); const needsExtraRestElement = eitherHasEffectiveRest && !hasEffectiveRestParameter(longest); const params = new Array(longestCount + (needsExtraRestElement ? 1 : 0)); @@ -7129,11 +7131,16 @@ namespace ts { const unionParamType = getIntersectionType([longestParamType, shorterParamType]); const isRestParam = eitherHasEffectiveRest && !needsExtraRestElement && i === (longestCount - 1); const isOptional = i >= getMinArgumentCount(longest) && i >= getMinArgumentCount(shorter); - const leftName = getParameterNameAtPosition(left, i); - const rightName = getParameterNameAtPosition(right, i); + const leftName = i >= leftCount ? undefined : getParameterNameAtPosition(left, i); + const rightName = i >= rightCount ? undefined : getParameterNameAtPosition(right, i); + + const paramName = leftName === rightName ? leftName : + !leftName ? rightName : + !rightName ? leftName : + undefined; const paramSymbol = createSymbol( SymbolFlags.FunctionScopedVariable | (isOptional && !isRestParam ? SymbolFlags.Optional : 0), - leftName === rightName ? leftName : `arg${i}` as __String + paramName || `arg${i}` as __String ); paramSymbol.type = isRestParam ? createArrayType(unionParamType) : unionParamType; params[i] = paramSymbol; diff --git a/tests/cases/fourslash/calledUnionsOfDissimilarTyeshaveGoodDisplay.ts b/tests/cases/fourslash/calledUnionsOfDissimilarTyeshaveGoodDisplay.ts index e8c42871b6748..a9b10fc67adad 100644 --- a/tests/cases/fourslash/calledUnionsOfDissimilarTyeshaveGoodDisplay.ts +++ b/tests/cases/fourslash/calledUnionsOfDissimilarTyeshaveGoodDisplay.ts @@ -34,6 +34,14 @@ //// ; //// ////callableThing4(/*4*/); +//// +////declare const callableThing5: +//// | ((a1: U) => void) +//// | (() => void) +//// ; +//// +////callableThing5(/*5*/1) +//// verify.signatureHelp({ marker: "1", @@ -50,4 +58,8 @@ verify.signatureHelp({ { marker: "4", text: "callableThing4(arg0: { x: number; } & { y: number; } & { z: number; } & { u: number; } & { v: number; } & { w: number; }): void" +}, +{ + marker: "5", + text: "callableThing5(a1: number): void" });