From cbf35328c8357175b9cd747823f39ade987c3d3c Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 4 Apr 2023 11:08:43 -0700 Subject: [PATCH] Revert "Makes inline completion suggest widget provider model observable. (#178988)" (#179171) This reverts commit 3bdd2975753aafa7d6316c618ad422e356bb2ff6. --- .../inlineCompletions/browser/ghostText.ts | 15 ++++++------ .../browser/inlineCompletionsModel.ts | 15 +++++++++--- .../suggestWidgetInlineCompletionProvider.ts | 23 +++++++++++-------- .../browser/suggestWidgetPreviewModel.ts | 9 ++++---- 4 files changed, 37 insertions(+), 25 deletions(-) diff --git a/src/vs/editor/contrib/inlineCompletions/browser/ghostText.ts b/src/vs/editor/contrib/inlineCompletions/browser/ghostText.ts index a8d848eb2a7..69a700b2843 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/ghostText.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/ghostText.ts @@ -83,14 +83,6 @@ export class GhostTextPart { } export class GhostTextReplacement { - public readonly parts: ReadonlyArray = [ - new GhostTextPart( - this.columnStart + this.length, - this.newLines, - false - ), - ]; - constructor( readonly lineNumber: number, readonly columnStart: number, @@ -98,6 +90,13 @@ export class GhostTextReplacement { readonly newLines: readonly string[], public readonly additionalReservedLineCount: number = 0, ) { } + public readonly parts: ReadonlyArray = [ + new GhostTextPart( + this.columnStart + this.length, + this.newLines, + false + ), + ]; renderForScreenReader(_lineText: string): string { return this.newLines.join('\n'); diff --git a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel.ts b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel.ts index b5f88d222cd..4f79ed9fd6d 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel.ts @@ -78,17 +78,26 @@ export class InlineCompletionsModel extends Disposable implements GhostTextWidge }) ); - this._register(this.editor.onDidType((e) => { this.handleUserInput(); })); + this._register( + this.editor.onDidType((e) => { + this.handleUserInput(); + }) + ); this._register( this.editor.onDidChangeCursorPosition((e) => { - if (e.reason === CursorChangeReason.Explicit || this.session && !this.session.isValid) { + if (e.reason === CursorChangeReason.Explicit || + this.session && !this.session.isValid) { this.hide(); } }) ); - this._register(toDisposable(() => { this.disposed = true; })); + this._register( + toDisposable(() => { + this.disposed = true; + }) + ); this._register( this.editor.onDidBlurEditorWidget(() => { diff --git a/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider.ts b/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider.ts index 14396d5890e..0ff0c4d5726 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { compareBy, findMaxBy, numberComparator } from 'vs/base/common/arrays'; -import { Event } from 'vs/base/common/event'; +import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { IActiveCodeEditor } from 'vs/editor/browser/editorBrowser'; import { Position } from 'vs/editor/common/core/position'; @@ -15,7 +15,6 @@ import { SnippetSession } from 'vs/editor/contrib/snippet/browser/snippetSession import { CompletionItem } from 'vs/editor/contrib/suggest/browser/suggest'; import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; import { minimizeInlineCompletion, NormalizedInlineCompletion, normalizedInlineCompletionsEquals } from './inlineCompletionToGhostText'; -import { IObservable, observableValue, transaction } from 'vs/base/common/observable'; export interface SuggestWidgetState { /** @@ -35,11 +34,18 @@ export class SuggestWidgetInlineCompletionProvider extends Disposable { private isShiftKeyPressed = false; private _isActive = false; private _currentSuggestItemInfo: SuggestItemInfo | undefined = undefined; + private readonly onDidChangeEmitter = new Emitter(); - private readonly _state = observableValue('suggestWidgetInlineCompletionProvider.state', undefined as SuggestWidgetState | undefined); + public readonly onDidChange = this.onDidChangeEmitter.event; - public get state(): IObservable { - return this._state; + /** + * Returns undefined if the suggest widget is not active. + */ + get state(): SuggestWidgetState | undefined { + if (!this._isActive) { + return undefined; + } + return { selectedItem: this._currentSuggestItemInfo }; } constructor( @@ -81,7 +87,8 @@ export class SuggestWidgetInlineCompletionProvider extends Disposable { if (!normalizedSuggestItem) { return undefined; } - const valid = rangeStartsWith(normalizedItemToPreselect.range, normalizedSuggestItem.range) && + const valid = + rangeStartsWith(normalizedItemToPreselect.range, normalizedSuggestItem.range) && normalizedItemToPreselect.insertText.startsWith(normalizedSuggestItem.insertText); return { index, valid, prefixLength: normalizedSuggestItem.insertText.length, suggestItem }; }) @@ -135,9 +142,7 @@ export class SuggestWidgetInlineCompletionProvider extends Disposable { shouldFire = true; } if (shouldFire) { - transaction(tx => { - this._state.set(this._isActive ? { selectedItem: this._currentSuggestItemInfo } : undefined, tx); - }); + this.onDidChangeEmitter.fire(); } } diff --git a/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetPreviewModel.ts b/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetPreviewModel.ts index 2ae06a79404..0de4fb2806a 100644 --- a/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetPreviewModel.ts +++ b/src/vs/editor/contrib/inlineCompletions/browser/suggestWidgetPreviewModel.ts @@ -16,7 +16,6 @@ import { BaseGhostTextWidgetModel, GhostText } from './ghostText'; import { provideInlineCompletions, TrackedInlineCompletions, UpdateOperation } from './inlineCompletionsModel'; import { inlineCompletionToGhostText, minimizeInlineCompletion, NormalizedInlineCompletion } from './inlineCompletionToGhostText'; import { SuggestWidgetInlineCompletionProvider } from './suggestWidgetInlineCompletionProvider'; -import { autorun } from 'vs/base/common/observable'; export class SuggestWidgetPreviewModel extends BaseGhostTextWidgetModel { private readonly suggestionInlineCompletionSource = this._register( @@ -46,7 +45,7 @@ export class SuggestWidgetPreviewModel extends BaseGhostTextWidgetModel { ) { super(editor); - this._register(autorun('update', reader => { + this._register(this.suggestionInlineCompletionSource.onDidChange(() => { if (!this.editor.hasModel()) { // onDidChange might be called when calling setModel on the editor, before we are disposed. return; @@ -54,7 +53,7 @@ export class SuggestWidgetPreviewModel extends BaseGhostTextWidgetModel { this.updateCacheSoon.schedule(); - const suggestWidgetState = this.suggestionInlineCompletionSource.state.read(reader); + const suggestWidgetState = this.suggestionInlineCompletionSource.state; if (!suggestWidgetState) { this.minReservedLineCount = 0; } @@ -91,7 +90,7 @@ export class SuggestWidgetPreviewModel extends BaseGhostTextWidgetModel { } private async updateCache() { - const state = this.suggestionInlineCompletionSource.state.get(); + const state = this.suggestionInlineCompletionSource.state; if (!state || !state.selectedItem) { return; } @@ -153,7 +152,7 @@ export class SuggestWidgetPreviewModel extends BaseGhostTextWidgetModel { const augmentedCompletion = minimizeInlineCompletion(model, this.cache.value?.completions[0]?.toLiveInlineCompletion()); const suggestWidgetState = this.suggestionInlineCompletionSource.state; - const suggestInlineCompletion = minimizeInlineCompletion(model, suggestWidgetState?.get()?.selectedItem?.normalizedInlineCompletion); + const suggestInlineCompletion = minimizeInlineCompletion(model, suggestWidgetState?.selectedItem?.normalizedInlineCompletion); const isAugmentedCompletionValid = augmentedCompletion && suggestInlineCompletion