Skip to content

Commit 2dbb298

Browse files
hedietulugbekna
andauthored
JointInlineCompletionProvider fixes (#2291)
* JointInlineCompletionProvider fixes * careful to not error if nes provider is undefined --------- Co-authored-by: ulugbekna <[email protected]>
1 parent 3e8e4dd commit 2dbb298

File tree

3 files changed

+30
-14
lines changed

3 files changed

+30
-14
lines changed

src/extension/completions-core/vscode-node/extension/src/inlineCompletion.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export class CopilotInlineCompletionItemProvider extends Disposable implements I
5858
pendingRequests: Set<Promise<unknown>> = new Set();
5959

6060
public onDidChange = undefined;
61-
public handleListEndOfLifetime = undefined;
61+
public handleListEndOfLifetime: InlineCompletionItemProvider['handleListEndOfLifetime'] = undefined;
6262

6363
constructor(
6464
@IInstantiationService private readonly instantiationService: IInstantiationService,

src/extension/inlineEdits/vscode-node/inlineCompletionProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { CancellationToken, Command, EndOfLine, InlineCompletionContext, InlineCompletionDisplayLocation, InlineCompletionDisplayLocationKind, InlineCompletionEndOfLifeReason, InlineCompletionEndOfLifeReasonKind, InlineCompletionItem, InlineCompletionItemProvider, InlineCompletionList, InlineCompletionsDisposeReason, InlineCompletionsDisposeReasonKind, NotebookCell, NotebookCellKind, Position, Range, TextDocument, TextDocumentShowOptions, Event as vscodeEvent, window, workspace } from 'vscode';
76
import * as l10n from '@vscode/l10n';
7+
import { CancellationToken, Command, EndOfLine, InlineCompletionContext, InlineCompletionDisplayLocation, InlineCompletionDisplayLocationKind, InlineCompletionEndOfLifeReason, InlineCompletionEndOfLifeReasonKind, InlineCompletionItem, InlineCompletionItemProvider, InlineCompletionList, InlineCompletionsDisposeReason, InlineCompletionsDisposeReasonKind, NotebookCell, NotebookCellKind, Position, Range, TextDocument, TextDocumentShowOptions, Event as vscodeEvent, window, workspace } from 'vscode';
88
import { ConfigKey, IConfigurationService } from '../../../platform/configuration/common/configurationService';
99
import { IDiffService } from '../../../platform/diff/common/diffService';
1010
import { stringEditFromDiff } from '../../../platform/editing/common/edit';

src/extension/inlineEdits/vscode-node/jointInlineCompletionProvider.ts

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import { ILogService } from '../../../platform/log/common/logService';
1717
import { isNotebookCell } from '../../../util/common/notebooks';
1818
import { createTracer } from '../../../util/common/tracing';
1919
import { assertNever, softAssert } from '../../../util/vs/base/common/assert';
20-
import { StatefulPromise } from '../../../util/vs/base/common/async';
2120
import { CancellationTokenSource } from '../../../util/vs/base/common/cancellation';
2221
import { Disposable, DisposableStore } from '../../../util/vs/base/common/lifecycle';
2322
import { autorun, derived, derivedDisposable, observableFromEvent } from '../../../util/vs/base/common/observable';
@@ -192,9 +191,9 @@ export class JointCompletionsProviderContribution extends Disposable implements
192191
'*',
193192
singularProvider,
194193
{
195-
displayName: 'completions+nes',
194+
displayName: inlineEditProvider?.displayName,
196195
debounceDelayMs: 0, // set 0 debounce to ensure consistent delays/timings
197-
groupId: 'completions+nes', // FIXME@ulugbekna: is this ok?
196+
groupId: 'nes',
198197
excludes,
199198
})
200199
);
@@ -275,29 +274,46 @@ class JointCompletionsProvider extends Disposable implements vscode.InlineComple
275274
completionsP = this._completionsProvider.provideInlineCompletionItems(document, position, context, token);
276275
}
277276

278-
let nesP: StatefulPromise<NesCompletionList | undefined> | undefined;
277+
let nesEndOfLifeReason: vscode.InlineCompletionsDisposeReason | undefined = undefined;
278+
let nesP: Promise<NesCompletionList | undefined> | undefined;
279279
if (this._inlineEditProvider === undefined) {
280280
tracer.trace(`- no NES provider`);
281281
nesP = undefined;
282282
} else {
283283
tracer.trace(`- requesting NES provideInlineCompletionItems`);
284-
nesP = new StatefulPromise(this._inlineEditProvider.provideInlineCompletionItems(document, position, context, nesCts.token));
284+
nesP = this._inlineEditProvider.provideInlineCompletionItems(document, position, context, nesCts.token).then(v => {
285+
if (nesEndOfLifeReason !== undefined) {
286+
for (const item of (v?.items as NesCompletionItem[]) ?? []) {
287+
this._inlineEditProvider?.handleEndOfLifetime?.(item, { kind: vscode.InlineCompletionEndOfLifeReasonKind.Ignored, userTypingDisagreed: false });
288+
}
289+
this._inlineEditProvider?.handleListEndOfLifetime?.(v!, nesEndOfLifeReason);
290+
return undefined;
291+
}
292+
return v;
293+
});
285294
}
286295

287296
tracer.trace(`waiting for completions response`);
288297

289298
const completionsR = completionsP ? await completionsP : undefined;
290299
tracer.trace(`got completions response in ${sw.elapsed()}ms -- ${completionsR === undefined ? 'undefined' : `with ${completionsR.items.length} items`}`);
291300

292-
if (completionsR && completionsR.items.length > 0) {
293-
tracer.trace(`using completions response, cancelling NES provider`);
294-
nesCts.cancel(); // cancel NES request if completions are available
295-
const list: SingularCompletionList = toCompletionsList(completionsR);
296-
tracer.returns(`use completions response in ${sw.elapsed()}ms`);
297-
return list;
301+
if (completionsR) {
302+
if (completionsR.items.length === 0) {
303+
this._completionsProvider?.handleListEndOfLifetime?.(completionsR, { kind: vscode.InlineCompletionsDisposeReasonKind.NotTaken });
304+
} else {
305+
tracer.trace(`using completions response, cancelling NES provider`);
306+
nesCts.cancel(); // cancel NES request if completions are available
307+
const list: SingularCompletionList = toCompletionsList(completionsR);
308+
tracer.returns(`use completions response in ${sw.elapsed()}ms`);
309+
310+
nesEndOfLifeReason = { kind: vscode.InlineCompletionsDisposeReasonKind.LostRace };
311+
312+
return list;
313+
}
298314
}
299315

300-
const nesR = nesP ? await nesP.promise : undefined;
316+
const nesR = nesP ? await nesP : undefined;
301317
tracer.trace(`got NES response in ${sw.elapsed()}ms -- ${nesR === undefined ? 'undefined' : `with ${nesR.items.length} items`}`);
302318

303319
if (nesR && nesR.items.length > 0) {

0 commit comments

Comments
 (0)