From 2c332cefa2ba7a55e48235b60753bfb5c1283232 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 12 Oct 2022 23:05:11 +0200 Subject: [PATCH] commit characters must check suggest model state before proceeding (#163467) fixes https://github.com/microsoft/vscode/issues/163431 --- .../suggest/browser/suggestCommitCharacters.ts | 14 ++++++++++++-- .../contrib/suggest/browser/suggestController.ts | 13 +++++-------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggestCommitCharacters.ts b/src/vs/editor/contrib/suggest/browser/suggestCommitCharacters.ts index 1b89a6435a8..61080e43376 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestCommitCharacters.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestCommitCharacters.ts @@ -8,6 +8,7 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { CharacterSet } from 'vs/editor/common/core/characterClassifier'; +import { State, SuggestModel } from 'vs/editor/contrib/suggest/browser/suggestModel'; import { ISelectedSuggestion, SuggestWidget } from './suggestWidget'; export class CommitCharacterController { @@ -19,14 +20,23 @@ export class CommitCharacterController { readonly item: ISelectedSuggestion; }; - constructor(editor: ICodeEditor, widget: SuggestWidget, accept: (selected: ISelectedSuggestion) => any) { + constructor(editor: ICodeEditor, widget: SuggestWidget, model: SuggestModel, accept: (selected: ISelectedSuggestion) => any) { + + this._disposables.add(model.onDidSuggest(e => { + if (e.completionModel.items.length === 0) { + this.reset(); + } + })); + this._disposables.add(model.onDidCancel(e => { + this.reset(); + })); this._disposables.add(widget.onDidShow(() => this._onItem(widget.getFocusedItem()))); this._disposables.add(widget.onDidFocus(this._onItem, this)); this._disposables.add(widget.onDidHide(this.reset, this)); this._disposables.add(editor.onWillType(text => { - if (this._active && !widget.isFrozen()) { + if (this._active && !widget.isFrozen() && model.state !== State.Idle) { const ch = text.charCodeAt(text.length - 1); if (this._active.acceptCharacters.has(ch) && editor.getOption(EditorOption.acceptSuggestionOnCommitCharacter)) { accept(this._active.item); diff --git a/src/vs/editor/contrib/suggest/browser/suggestController.ts b/src/vs/editor/contrib/suggest/browser/suggestController.ts index 14045fe6bec..21a4e1ff60d 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestController.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestController.ts @@ -47,8 +47,9 @@ import { basename, extname } from 'vs/base/common/resources'; import { hash } from 'vs/base/common/hash'; // sticky suggest widget which doesn't disappear on focus out and such -const _sticky = false; -// _sticky = Boolean("true"); // done "weirdly" so that a lint warning prevents you from pushing this +const _sticky = false + // || Boolean("true") // done "weirdly" so that a lint warning prevents you from pushing this + ; class LineSuffix { @@ -142,13 +143,9 @@ export class SuggestController implements IEditorContribution { this._toDispose.add(widget.onDidSelect(item => this._insertSuggestion(item, 0), this)); // Wire up logic to accept a suggestion on certain characters - const commitCharacterController = new CommitCharacterController(this.editor, widget, item => this._insertSuggestion(item, InsertFlags.NoAfterUndoStop)); + const commitCharacterController = new CommitCharacterController(this.editor, widget, this.model, item => this._insertSuggestion(item, InsertFlags.NoAfterUndoStop)); this._toDispose.add(commitCharacterController); - this._toDispose.add(this.model.onDidSuggest(e => { - if (e.completionModel.items.length === 0) { - commitCharacterController.reset(); - } - })); + // Wire up makes text edit context key const ctxMakesTextEdit = SuggestContext.MakesTextEdit.bindTo(this._contextKeyService);