monaco-editor-core
Version:
A browser based code editor
57 lines (56 loc) • 2.47 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { isNonEmptyArray } from '../../../../base/common/arrays.js';
import { DisposableStore } from '../../../../base/common/lifecycle.js';
import { CharacterSet } from '../../../common/core/characterClassifier.js';
export class CommitCharacterController {
constructor(editor, widget, model, accept) {
this._disposables = new DisposableStore();
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() && model.state !== 0 /* State.Idle */) {
const ch = text.charCodeAt(text.length - 1);
if (this._active.acceptCharacters.has(ch) && editor.getOption(0 /* EditorOption.acceptSuggestionOnCommitCharacter */)) {
accept(this._active.item);
}
}
}));
}
_onItem(selected) {
if (!selected || !isNonEmptyArray(selected.item.completion.commitCharacters)) {
// no item or no commit characters
this.reset();
return;
}
if (this._active && this._active.item.item === selected.item) {
// still the same item
return;
}
// keep item and its commit characters
const acceptCharacters = new CharacterSet();
for (const ch of selected.item.completion.commitCharacters) {
if (ch.length > 0) {
acceptCharacters.add(ch.charCodeAt(0));
}
}
this._active = { acceptCharacters, item: selected };
}
reset() {
this._active = undefined;
}
dispose() {
this._disposables.dispose();
}
}