@@ -17,7 +17,6 @@ import { ILogService } from '../../../platform/log/common/logService';
1717import { isNotebookCell } from '../../../util/common/notebooks' ;
1818import { createTracer } from '../../../util/common/tracing' ;
1919import { assertNever , softAssert } from '../../../util/vs/base/common/assert' ;
20- import { StatefulPromise } from '../../../util/vs/base/common/async' ;
2120import { CancellationTokenSource } from '../../../util/vs/base/common/cancellation' ;
2221import { Disposable , DisposableStore } from '../../../util/vs/base/common/lifecycle' ;
2322import { 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