From 52dbedd03481d94134ed2c1fbdeb82eb9c19cf3d Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Tue, 23 Nov 2021 12:05:37 +0100 Subject: [PATCH] Implements #137004. When an inline completion provider provides a suited augmented inline completion, a preview will be shown even if editor.suggest.preview is set to false. --- .../suggestWidgetPreviewModel.ts | 63 +++++++++---------- .../test/suggestWidgetModel.test.ts | 2 +- 2 files changed, 32 insertions(+), 33 deletions(-) diff --git a/src/vs/editor/contrib/inlineCompletions/suggestWidgetPreviewModel.ts b/src/vs/editor/contrib/inlineCompletions/suggestWidgetPreviewModel.ts index c9f5ec9ef30..cdcf667cecc 100644 --- a/src/vs/editor/contrib/inlineCompletions/suggestWidgetPreviewModel.ts +++ b/src/vs/editor/contrib/inlineCompletions/suggestWidgetPreviewModel.ts @@ -51,7 +51,7 @@ export class SuggestWidgetPreviewModel extends BaseGhostTextWidgetModel { this.minReservedLineCount = Math.max(this.minReservedLineCount, sum(newGhostText.parts.map(p => p.lines.length - 1))); } - if (this.minReservedLineCount >= 1 && this.isSuggestionPreviewEnabled()) { + if (this.minReservedLineCount >= 1) { this.suggestionInlineCompletionSource.forceRenderingAbove(); } else { this.suggestionInlineCompletionSource.stopForceRenderingAbove(); @@ -64,11 +64,9 @@ export class SuggestWidgetPreviewModel extends BaseGhostTextWidgetModel { })); this._register(this.editor.onDidChangeCursorPosition((e) => { - if (this.isSuggestionPreviewEnabled()) { - this.minReservedLineCount = 0; - this.updateCacheSoon.schedule(); - this.onDidChangeEmitter.fire(); - } + this.minReservedLineCount = 0; + this.updateCacheSoon.schedule(); + this.onDidChangeEmitter.fire(); })); this._register(toDisposable(() => this.suggestionInlineCompletionSource.stopForceRenderingAbove())); @@ -123,39 +121,40 @@ export class SuggestWidgetPreviewModel extends BaseGhostTextWidgetModel { } public override get ghostText(): GhostText | undefined { - if (!this.isSuggestionPreviewEnabled()) { + const isSuggestionPreviewEnabled = this.isSuggestionPreviewEnabled(); + const augmentedCompletion = minimizeInlineCompletion(this.editor.getModel()!, this.cache.value?.completions[0]?.toLiveInlineCompletion()); + + const suggestWidgetState = this.suggestionInlineCompletionSource.state; + const suggestInlineCompletion = minimizeInlineCompletion(this.editor.getModel()!, suggestWidgetState?.selectedItemAsInlineCompletion); + + const isAugmentedCompletionValid = augmentedCompletion + && suggestInlineCompletion + && augmentedCompletion.text.startsWith(suggestInlineCompletion.text) + && augmentedCompletion.range.equalsRange(suggestInlineCompletion.range); + + if (!isSuggestionPreviewEnabled && !isAugmentedCompletionValid) { return undefined; } - const suggestWidgetState = this.suggestionInlineCompletionSource.state; + // If the augmented completion is not valid and there is no suggest inline completion, we still show the augmented completion. + const finalCompletion = isAugmentedCompletionValid ? augmentedCompletion : (suggestInlineCompletion || augmentedCompletion); - const originalInlineCompletion = minimizeInlineCompletion(this.editor.getModel()!, suggestWidgetState?.selectedItemAsInlineCompletion); - const augmentedCompletion = minimizeInlineCompletion(this.editor.getModel()!, this.cache.value?.completions[0]?.toLiveInlineCompletion()); - - const finalCompletion = - augmentedCompletion - && originalInlineCompletion - && augmentedCompletion.text.startsWith(originalInlineCompletion.text) - && augmentedCompletion.range.equalsRange(originalInlineCompletion.range) - ? augmentedCompletion : (originalInlineCompletion || augmentedCompletion); - - const inlineCompletionPreviewLength = originalInlineCompletion ? (finalCompletion?.text.length || 0) - (originalInlineCompletion.text.length) : 0; - - const toGhostText = (completion: NormalizedInlineCompletion | undefined): GhostText | undefined => { - const mode = this.editor.getOptions().get(EditorOption.suggest).previewMode; - return completion - ? ( - inlineCompletionToGhostText(completion, this.editor.getModel(), mode, this.editor.getPosition(), inlineCompletionPreviewLength) || - // Show an invisible ghost text to reserve space - new GhostText(completion.range.endLineNumber, [], this.minReservedLineCount) - ) - : undefined; - }; - - const newGhostText = toGhostText(finalCompletion); + const inlineCompletionPreviewLength = isAugmentedCompletionValid ? finalCompletion!.text.length - suggestInlineCompletion.text.length : 0; + const newGhostText = this.toGhostText(finalCompletion, inlineCompletionPreviewLength); return newGhostText; } + + private toGhostText(completion: NormalizedInlineCompletion | undefined, inlineCompletionPreviewLength: number): GhostText | undefined { + const mode = this.editor.getOptions().get(EditorOption.suggest).previewMode; + return completion + ? ( + inlineCompletionToGhostText(completion, this.editor.getModel(), mode, this.editor.getPosition(), inlineCompletionPreviewLength) || + // Show an invisible ghost text to reserve space + new GhostText(completion.range.endLineNumber, [], this.minReservedLineCount) + ) + : undefined; + } } function sum(arr: number[]): number { diff --git a/src/vs/editor/contrib/inlineCompletions/test/suggestWidgetModel.test.ts b/src/vs/editor/contrib/inlineCompletions/test/suggestWidgetModel.test.ts index b45349df0be..c798d998c44 100644 --- a/src/vs/editor/contrib/inlineCompletions/test/suggestWidgetModel.test.ts +++ b/src/vs/editor/contrib/inlineCompletions/test/suggestWidgetModel.test.ts @@ -63,7 +63,7 @@ suite('Suggest Widget Model', () => { const suggestController = (editor.getContribution(SuggestController.ID) as SuggestController); suggestController.triggerSuggest(); await timeout(1000); - assert.deepStrictEqual(history.splice(0), [true]); + assert.deepStrictEqual(history.splice(0), [false, true]); context.keyboardType('.'); await timeout(1000);