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" },
);