diff --git a/src/services/completions.ts b/src/services/completions.ts index c2f8bb72aff06..bc36400bf35f5 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -666,7 +666,7 @@ export function getCompletionsAtPosition( const compilerOptions = program.getCompilerOptions(); const incompleteCompletionsCache = preferences.allowIncompleteCompletions ? host.getIncompleteCompletionsCache?.() : undefined; if (incompleteCompletionsCache && completionKind === CompletionTriggerKind.TriggerForIncompleteCompletions && previousToken && isIdentifier(previousToken)) { - const incompleteContinuation = continuePreviousIncompleteResponse(incompleteCompletionsCache, sourceFile, previousToken, program, host, preferences, cancellationToken); + const incompleteContinuation = continuePreviousIncompleteResponse(incompleteCompletionsCache, sourceFile, previousToken, program, host, preferences, cancellationToken, position); if (incompleteContinuation) { return incompleteContinuation; } @@ -750,10 +750,12 @@ function continuePreviousIncompleteResponse( host: LanguageServiceHost, preferences: UserPreferences, cancellationToken: CancellationToken, + position: number, ): CompletionInfo | undefined { const previousResponse = cache.get(); if (!previousResponse) return undefined; + const touchNode = getTouchingPropertyName(file, position); const lowerCaseTokenText = location.text.toLowerCase(); const exportMap = getExportInfoMap(file, host, program, preferences, cancellationToken); const newEntries = resolvingModuleSpecifiers( @@ -809,6 +811,7 @@ function continuePreviousIncompleteResponse( previousResponse.entries = newEntries; previousResponse.flags = (previousResponse.flags || 0) | CompletionInfoFlags.IsContinuation; + previousResponse.optionalReplacementSpan = getOptionalReplacementSpan(touchNode); return previousResponse; } diff --git a/src/testRunner/unittests/tsserver/completionsIncomplete.ts b/src/testRunner/unittests/tsserver/completionsIncomplete.ts index 41baa9505f83e..25a98bf768d33 100644 --- a/src/testRunner/unittests/tsserver/completionsIncomplete.ts +++ b/src/testRunner/unittests/tsserver/completionsIncomplete.ts @@ -65,10 +65,12 @@ describe("unittests:: tsserver:: completionsIncomplete", () => { assert(completions.isIncomplete); assert.lengthOf(completions.entries.filter(entry => (entry.data as any)?.moduleSpecifier), ts.Completions.moduleSpecifierResolutionLimit); assert.lengthOf(completions.entries.filter(entry => entry.source && !(entry.data as any)?.moduleSpecifier), excessFileCount); + assert.deepEqual(completions.optionalReplacementSpan, { start: { line: 1, offset: 1 }, end: { line: 1, offset: 2 } }); }) .continueTyping("a", completions => { assert(completions.isIncomplete); assert.lengthOf(completions.entries.filter(entry => (entry.data as any)?.moduleSpecifier), ts.Completions.moduleSpecifierResolutionLimit * 2); + assert.deepEqual(completions.optionalReplacementSpan, { start: { line: 1, offset: 1 }, end: { line: 1, offset: 3 } }); }) .continueTyping("_", completions => { assert(!completions.isIncomplete);