From 7c197becb65afcbfb34fc8ca4b7b598c39e5748a Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Thu, 29 Jul 2021 00:52:37 +0300 Subject: [PATCH] feat(45210): add inlay hints for getters and setters (#45214) --- src/services/inlayHints.ts | 14 +++-------- .../cases/fourslash/inlayHintsShouldWork55.ts | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 tests/cases/fourslash/inlayHintsShouldWork55.ts diff --git a/src/services/inlayHints.ts b/src/services/inlayHints.ts index 461945679af..8826639c076 100644 --- a/src/services/inlayHints.ts +++ b/src/services/inlayHints.ts @@ -67,7 +67,7 @@ namespace ts.InlayHints { if (preferences.includeInlayFunctionParameterTypeHints && isFunctionExpressionLike(node)) { visitFunctionExpressionLikeForParameterType(node); } - if (preferences.includeInlayFunctionLikeReturnTypeHints && isFunctionDeclarationLike(node)) { + if (preferences.includeInlayFunctionLikeReturnTypeHints && isFunctionLikeDeclaration(node)) { visitFunctionDeclarationLikeForReturnType(node); } } @@ -78,10 +78,6 @@ namespace ts.InlayHints { return isArrowFunction(node) || isFunctionExpression(node); } - function isFunctionDeclarationLike(node: Node): node is FunctionDeclaration | ArrowFunction | FunctionExpression | MethodDeclaration { - return isArrowFunction(node) || isFunctionExpression(node) || isFunctionDeclaration(node) || isMethodDeclaration(node); - } - function addParameterHints(text: string, position: number, isFirstVariadicArgument: boolean) { result.push({ text: `${isFirstVariadicArgument ? "..." : ""}${truncation(text, maxHintsLength)}:`, @@ -206,7 +202,7 @@ namespace ts.InlayHints { return isLiteralExpression(node) || isBooleanLiteral(node) || isFunctionExpressionLike(node) || isObjectLiteralExpression(node) || isArrayLiteralExpression(node); } - function visitFunctionDeclarationLikeForReturnType(decl: ArrowFunction | FunctionExpression | MethodDeclaration | FunctionDeclaration) { + function visitFunctionDeclarationLikeForReturnType(decl: FunctionLikeDeclaration) { if (isArrowFunction(decl)) { if (!findChildOfKind(decl, SyntaxKind.OpenParenToken, file)) { return; @@ -218,9 +214,7 @@ namespace ts.InlayHints { return; } - const type = checker.getTypeAtLocation(decl); - const signatures = checker.getSignaturesOfType(type, SignatureKind.Call); - const signature = firstOrUndefined(signatures); + const signature = checker.getSignatureFromDeclaration(decl); if (!signature) { return; } @@ -238,7 +232,7 @@ namespace ts.InlayHints { addTypeHints(typeDisplayString, getTypeAnnotationPosition(decl)); } - function getTypeAnnotationPosition(decl: ArrowFunction | FunctionExpression | MethodDeclaration | FunctionDeclaration) { + function getTypeAnnotationPosition(decl: FunctionLikeDeclaration) { const closeParenToken = findChildOfKind(decl, SyntaxKind.CloseParenToken, file); if (closeParenToken) { return closeParenToken.end; diff --git a/tests/cases/fourslash/inlayHintsShouldWork55.ts b/tests/cases/fourslash/inlayHintsShouldWork55.ts new file mode 100644 index 00000000000..d75fbe9e900 --- /dev/null +++ b/tests/cases/fourslash/inlayHintsShouldWork55.ts @@ -0,0 +1,25 @@ +/// + +////class Foo { +//// get foo()/*a*/ { return 1; } +//// set foo(value: number)/*b*/ {} +////} + +const [a, b] = test.markers(); + +verify.getInlayHints([ + { + text: ': number', + position: a.position, + kind: ts.InlayHintKind.Type, + whitespaceBefore: true + }, + { + text: ': void', + position: b.position, + kind: ts.InlayHintKind.Type, + whitespaceBefore: true + }, +], undefined, { + includeInlayFunctionLikeReturnTypeHints: true +});