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 @@
+///
(p: { type: P }): void; +//// +//// bar1({ type: "/*ts*/" }) +//// + +verify.completions({ marker: ["ts"], exact: ["", "bar", "baz"] });