From e8a2b5d7784b12e183fec358f99f10e60eb65d08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Mon, 5 Dec 2022 23:50:10 +0100 Subject: [PATCH] Improve string literal completions for property values when a partially-typed string fixes inference to a type parameter --- src/services/stringCompletions.ts | 2 +- src/services/utilities.ts | 9 +++++---- .../completionsLiteralOnPropertyValueMatchingGeneric.ts | 9 +++++++++ 3 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 tests/cases/fourslash/completionsLiteralOnPropertyValueMatchingGeneric.ts diff --git a/src/services/stringCompletions.ts b/src/services/stringCompletions.ts index c319ad3b8e92a..37e1e944e0742 100644 --- a/src/services/stringCompletions.ts +++ b/src/services/stringCompletions.ts @@ -417,7 +417,7 @@ function getStringLiteralCompletionEntries(sourceFile: SourceFile, node: StringL function fromContextualType(): StringLiteralCompletion { // Get completion for string literal from string literal type // i.e. var x: "hi" | "hello" = "/*completion position*/" - return { kind: StringLiteralCompletionKind.Types, types: getStringLiteralTypes(getContextualTypeFromParent(node, typeChecker)), isNewIdentifier: false }; + return { kind: StringLiteralCompletionKind.Types, types: getStringLiteralTypes(getContextualTypeFromParent(node, typeChecker, ContextFlags.Completions)), isNewIdentifier: false }; } } diff --git a/src/services/utilities.ts b/src/services/utilities.ts index a5e151ac7ab1a..7ce92256c4391 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -29,6 +29,7 @@ import { CompilerOptions, ConditionalExpression, contains, + ContextFlags, createPrinter, createRange, createScanner, @@ -3277,21 +3278,21 @@ export function needsParentheses(expression: Expression): boolean { } /** @internal */ -export function getContextualTypeFromParent(node: Expression, checker: TypeChecker): Type | undefined { +export function getContextualTypeFromParent(node: Expression, checker: TypeChecker, contextFlags?: ContextFlags): Type | undefined { const { parent } = node; switch (parent.kind) { case SyntaxKind.NewExpression: - return checker.getContextualType(parent as NewExpression); + return checker.getContextualType(parent as NewExpression, contextFlags); case SyntaxKind.BinaryExpression: { const { left, operatorToken, right } = parent as BinaryExpression; return isEqualityOperatorKind(operatorToken.kind) ? checker.getTypeAtLocation(node === right ? left : right) - : checker.getContextualType(node); + : checker.getContextualType(node, contextFlags); } case SyntaxKind.CaseClause: return (parent as CaseClause).expression === node ? getSwitchedType(parent as CaseClause, checker) : undefined; default: - return checker.getContextualType(node); + return checker.getContextualType(node, contextFlags); } } diff --git a/tests/cases/fourslash/completionsLiteralOnPropertyValueMatchingGeneric.ts b/tests/cases/fourslash/completionsLiteralOnPropertyValueMatchingGeneric.ts new file mode 100644 index 0000000000000..8b19908ed922f --- /dev/null +++ b/tests/cases/fourslash/completionsLiteralOnPropertyValueMatchingGeneric.ts @@ -0,0 +1,9 @@ +/// + +// @Filename: /a.tsx +//// declare function bar1

(p: { type: P }): void; +//// +//// bar1({ type: "/*ts*/" }) +//// + +verify.completions({ marker: ["ts"], exact: ["", "bar", "baz"] });