diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 832c9df6b852f..c9548e8dac31f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1426,6 +1426,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { let inlineLevel = 0; let currentNode: Node | undefined; let varianceTypeParameter: TypeParameter | undefined; + let isInferencePartiallyBlocked = false; const emptySymbols = createSymbolTable(); const arrayVariances = [VarianceFlags.Covariant]; @@ -1838,7 +1839,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { toMarkSkip = toMarkSkip.parent; } while (toMarkSkip && toMarkSkip !== containingCall); } + + isInferencePartiallyBlocked = true; const result = runWithoutResolvedSignatureCaching(node, fn); + isInferencePartiallyBlocked = false; + if (containingCall) { let toMarkSkip = node!; do { @@ -32667,7 +32672,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { const isTaggedTemplate = node.kind === SyntaxKind.TaggedTemplateExpression; const isDecorator = node.kind === SyntaxKind.Decorator; const isJsxOpeningOrSelfClosingElement = isJsxOpeningLikeElement(node); - const reportErrors = !candidatesOutArray; + const reportErrors = !isInferencePartiallyBlocked && !candidatesOutArray; let typeArguments: NodeArray | undefined; diff --git a/tests/cases/fourslash/noErrorsAfterCompletionsRequestWithinGenericFunction1.ts b/tests/cases/fourslash/noErrorsAfterCompletionsRequestWithinGenericFunction1.ts new file mode 100644 index 0000000000000..0ef19b43fcbd4 --- /dev/null +++ b/tests/cases/fourslash/noErrorsAfterCompletionsRequestWithinGenericFunction1.ts @@ -0,0 +1,9 @@ +/// +// @strict: true +//// +//// declare function func(arg: T): void; +//// func({ foo: 1, bar/*1*/: 1 }); + +goTo.marker("1"); +verify.completions({ exact: undefined }); +verify.noErrors(); diff --git a/tests/cases/fourslash/noErrorsAfterCompletionsRequestWithinGenericFunction2.ts b/tests/cases/fourslash/noErrorsAfterCompletionsRequestWithinGenericFunction2.ts new file mode 100644 index 0000000000000..6069ac397fdb7 --- /dev/null +++ b/tests/cases/fourslash/noErrorsAfterCompletionsRequestWithinGenericFunction2.ts @@ -0,0 +1,12 @@ +/// +// @strict: true +//// +//// // repro from #50818#issuecomment-1278324638 +//// +//// declare function func(arg: T): void; +//// func({ foo: 1, bar/*1*/: 1 }); + +goTo.marker("1"); +edit.insert("2"); +verify.completions({ exact: undefined }); +verify.noErrors(); diff --git a/tests/cases/fourslash/noErrorsAfterCompletionsRequestWithinGenericFunction3.ts b/tests/cases/fourslash/noErrorsAfterCompletionsRequestWithinGenericFunction3.ts new file mode 100644 index 0000000000000..11e8a819a3ebd --- /dev/null +++ b/tests/cases/fourslash/noErrorsAfterCompletionsRequestWithinGenericFunction3.ts @@ -0,0 +1,25 @@ +/// +// @strict: true +//// +//// // repro from #52580#issuecomment-1416131055 +//// +//// type Funcs> = { +//// [K in keyof B]: { +//// fn: (a: A, b: B) => void; +//// thing: B[K]; +//// } +//// } +//// +//// function foo>(fns: Funcs) {} +//// +//// foo({ +//// bar: { fn: (a: string, b) => {}, thing: "asd" }, +//// /*1*/ +//// }); + +goTo.marker("1"); +const markerPosition = test.markers()[0].position; +edit.paste(`bar: { fn: (a: string, b) => {}, thing: "asd" },`) +edit.replace(markerPosition + 4, 1, 'z') +verify.completions({ isNewIdentifierLocation: true }); +verify.noErrors();