From d08dfba7c8acd3ca9d75788af81367033c3d48f6 Mon Sep 17 00:00:00 2001 From: ShuiRuTian <158983297@qq.com> Date: Fri, 12 Nov 2021 20:43:11 +0800 Subject: [PATCH 1/2] use default type parameter rather than `unknown` when show quick help --- src/compiler/checker.ts | 3 ++- tests/cases/fourslash/signatureHelpExplicitTypeArguments.ts | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index e753210950a78..71525efbf4af7 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -30243,10 +30243,11 @@ namespace ts { } function getTypeArgumentsFromNodes(typeArgumentNodes: readonly TypeNode[], typeParameters: readonly TypeParameter[], isJs: boolean): readonly Type[] { - const typeArguments = typeArgumentNodes.map(getTypeOfNode); + let typeArguments = typeArgumentNodes.map(getTypeOfNode); while (typeArguments.length > typeParameters.length) { typeArguments.pop(); } + typeArguments = fillMissingTypeArguments(typeArguments, typeParameters, getMinTypeArgumentCount(typeParameters), isJs); while (typeArguments.length < typeParameters.length) { typeArguments.push(getConstraintOfTypeParameter(typeParameters[typeArguments.length]) || getDefaultTypeArgumentType(isJs)); } diff --git a/tests/cases/fourslash/signatureHelpExplicitTypeArguments.ts b/tests/cases/fourslash/signatureHelpExplicitTypeArguments.ts index b68c7640476bf..71b366a50af80 100644 --- a/tests/cases/fourslash/signatureHelpExplicitTypeArguments.ts +++ b/tests/cases/fourslash/signatureHelpExplicitTypeArguments.ts @@ -9,8 +9,8 @@ verify.signatureHelp( { marker: "1", text: "f(x: number, y: string): number" }, { marker: "2", text: "f(x: boolean, y: string): boolean" }, - // too few -- fill in rest with unknown - { marker: "3", text: "f(x: number, y: unknown): number" }, + // too few -- fill in rest with default + { marker: "3", text: "f(x: number, y: string): number" }, // too many -- ignore extra type arguments { marker: "4", text: "f(x: number, y: string): number" }, ); From a0aa803e616bb4a62aca6e79aa4996e12df7d09b Mon Sep 17 00:00:00 2001 From: ShuiRuTian <158983297@qq.com> Date: Tue, 16 Nov 2021 13:52:30 +0800 Subject: [PATCH 2/2] prefer default type parameter than constraint for quick info --- src/compiler/checker.ts | 5 ++- .../signatureHelpExplicitTypeArguments.ts | 31 ++++++++++++++++--- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 71525efbf4af7..f3986c1bc4c7f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -30243,13 +30243,12 @@ namespace ts { } function getTypeArgumentsFromNodes(typeArgumentNodes: readonly TypeNode[], typeParameters: readonly TypeParameter[], isJs: boolean): readonly Type[] { - let typeArguments = typeArgumentNodes.map(getTypeOfNode); + const typeArguments = typeArgumentNodes.map(getTypeOfNode); while (typeArguments.length > typeParameters.length) { typeArguments.pop(); } - typeArguments = fillMissingTypeArguments(typeArguments, typeParameters, getMinTypeArgumentCount(typeParameters), isJs); while (typeArguments.length < typeParameters.length) { - typeArguments.push(getConstraintOfTypeParameter(typeParameters[typeArguments.length]) || getDefaultTypeArgumentType(isJs)); + typeArguments.push(getDefaultFromTypeParameter(typeParameters[typeArguments.length]) || getConstraintOfTypeParameter(typeParameters[typeArguments.length]) || getDefaultTypeArgumentType(isJs)); } return typeArguments; } diff --git a/tests/cases/fourslash/signatureHelpExplicitTypeArguments.ts b/tests/cases/fourslash/signatureHelpExplicitTypeArguments.ts index 71b366a50af80..68a355d253394 100644 --- a/tests/cases/fourslash/signatureHelpExplicitTypeArguments.ts +++ b/tests/cases/fourslash/signatureHelpExplicitTypeArguments.ts @@ -1,10 +1,22 @@ /// -////declare function f(x: T, y: U): T; -////f(/*1*/); -////f(/*2*/); -////f(/*3*/); -////f(/*4*/); +//// declare function f(x: T, y: U): T; +//// f(/*1*/); +//// f(/*2*/); +//// f(/*3*/); +//// f(/*4*/); + +//// interface A { a: number } +//// interface B extends A { b: string } +//// declare function g(x: T, y: U, z: V): T; +//// declare function h(x: T, y: U, z: V): T; +//// declare function j(x: T, y: U, z: V): T; +//// g(/*5*/); +//// h(/*6*/); +//// j(/*7*/); +//// g(/*8*/); +//// h(/*9*/); +//// j(/*10*/); verify.signatureHelp( { marker: "1", text: "f(x: number, y: string): number" }, @@ -13,4 +25,13 @@ verify.signatureHelp( { marker: "3", text: "f(x: number, y: string): number" }, // too many -- ignore extra type arguments { marker: "4", text: "f(x: number, y: string): number" }, + + // not matched signature and no type arguments + { marker: "5", text: "g(x: unknown, y: unknown, z: B): unknown" }, + { marker: "6", text: "h(x: unknown, y: unknown, z: A): unknown" }, + { marker: "7", text: "j(x: unknown, y: unknown, z: B): unknown" }, + // not matched signature and too few type arguments + { marker: "8", text: "g(x: number, y: unknown, z: B): number" }, + { marker: "9", text: "h(x: number, y: unknown, z: A): number" }, + { marker: "10", text: "j(x: number, y: unknown, z: B): number" }, );