UNPKG

monaco-editor-core

Version:

A browser based code editor

91 lines (90 loc) 5.86 kB
/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; var InlineEditsController_1; import { Disposable } from '../../../../base/common/lifecycle.js'; import { derived, derivedObservableWithCache, observableValue } from '../../../../base/common/observable.js'; import { derivedDisposable, derivedWithSetter } from '../../../../base/common/observableInternal/derived.js'; import { observableCodeEditor } from '../../../browser/observableCodeEditor.js'; import { readHotReloadableExport } from '../../../../base/common/hotReloadHelpers.js'; import { Selection } from '../../../common/core/selection.js'; import { ILanguageFeatureDebounceService } from '../../../common/services/languageFeatureDebounce.js'; import { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js'; import { inlineEditVisible, isPinnedContextKey } from './consts.js'; import { InlineEditsModel } from './inlineEditsModel.js'; import { InlineEditsWidget } from './inlineEditsWidget.js'; import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js'; import { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js'; import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js'; import { bindContextKey, observableConfigValue } from '../../../../platform/observable/common/platformObservableUtils.js'; let InlineEditsController = class InlineEditsController extends Disposable { static { InlineEditsController_1 = this; } static { this.ID = 'editor.contrib.inlineEditsController'; } static get(editor) { return editor.getContribution(InlineEditsController_1.ID); } constructor(editor, _instantiationService, _contextKeyService, _debounceService, _languageFeaturesService, _configurationService) { super(); this.editor = editor; this._instantiationService = _instantiationService; this._contextKeyService = _contextKeyService; this._debounceService = _debounceService; this._languageFeaturesService = _languageFeaturesService; this._configurationService = _configurationService; this._enabled = observableConfigValue('editor.inlineEdits.enabled', false, this._configurationService); this._editorObs = observableCodeEditor(this.editor); this._selection = derived(this, reader => this._editorObs.cursorSelection.read(reader) ?? new Selection(1, 1, 1, 1)); this._debounceValue = this._debounceService.for(this._languageFeaturesService.inlineCompletionsProvider, 'InlineEditsDebounce', { min: 50, max: 50 }); this.model = derivedDisposable(this, reader => { if (!this._enabled.read(reader)) { return undefined; } if (this._editorObs.isReadonly.read(reader)) { return undefined; } const textModel = this._editorObs.model.read(reader); if (!textModel) { return undefined; } const model = this._instantiationService.createInstance(readHotReloadableExport(InlineEditsModel, reader), textModel, this._editorObs.versionId, this._selection, this._debounceValue); return model; }); this._hadInlineEdit = derivedObservableWithCache(this, (reader, lastValue) => lastValue || this.model.read(reader)?.inlineEdit.read(reader) !== undefined); this._widget = derivedDisposable(this, reader => { if (!this._hadInlineEdit.read(reader)) { return undefined; } return this._instantiationService.createInstance(readHotReloadableExport(InlineEditsWidget, reader), this.editor, this.model.map((m, reader) => m?.inlineEdit.read(reader)), flattenSettableObservable((reader) => this.model.read(reader)?.userPrompt ?? observableValue('empty', ''))); }); this._register(bindContextKey(inlineEditVisible, this._contextKeyService, r => !!this.model.read(r)?.inlineEdit.read(r))); this._register(bindContextKey(isPinnedContextKey, this._contextKeyService, r => !!this.model.read(r)?.isPinned.read(r))); this.model.recomputeInitiallyAndOnChange(this._store); this._widget.recomputeInitiallyAndOnChange(this._store); } }; InlineEditsController = InlineEditsController_1 = __decorate([ __param(1, IInstantiationService), __param(2, IContextKeyService), __param(3, ILanguageFeatureDebounceService), __param(4, ILanguageFeaturesService), __param(5, IConfigurationService) ], InlineEditsController); export { InlineEditsController }; function flattenSettableObservable(fn) { return derivedWithSetter(undefined, reader => { const obs = fn(reader); return obs.read(reader); }, (value, tx) => { fn(undefined).set(value, tx); }); }