123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- /*---------------------------------------------------------------------------------------------
- * 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, accept) {
- this._disposables = new DisposableStore();
- 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()) {
- const ch = text.charCodeAt(text.length - 1);
- if (this._active.acceptCharacters.has(ch) && editor.getOption(0 /* 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();
- }
- }
|