@codingame/monaco-vscode-extensions-service-override
Version:
VSCode public API plugged on the monaco editor - extensions service-override
228 lines (225 loc) • 10.8 kB
JavaScript
import { __decorate, __param } from 'vscode/external/tslib/tslib.es6.js';
import { illegalArgument } from 'vscode/vscode/vs/base/common/errors';
import { DisposableStore, dispose } from 'vscode/vscode/vs/base/common/lifecycle';
import { equals } from 'vscode/vscode/vs/base/common/objects';
import { URI } from 'vscode/vscode/vs/base/common/uri';
import { ICodeEditorService } from 'vscode/vscode/vs/editor/browser/services/codeEditorService';
import { CommandsRegistry } from 'vscode/vscode/vs/platform/commands/common/commands';
import { EditorActivation, EditorResolution } from 'vscode/vscode/vs/platform/editor/common/editor';
import { ExtHostContext } from 'vscode/vscode/vs/workbench/api/common/extHost.protocol';
import { editorGroupToColumn, columnToEditorGroup } from 'vscode/vscode/vs/workbench/services/editor/common/editorGroupColumn';
import { IEditorService } from 'vscode/vscode/vs/workbench/services/editor/common/editorService.service';
import { IEditorGroupsService } from 'vscode/vscode/vs/workbench/services/editor/common/editorGroupsService.service';
import { IEnvironmentService } from 'vscode/vscode/vs/platform/environment/common/environment.service';
import { IWorkingCopyService } from 'vscode/vscode/vs/workbench/services/workingCopy/common/workingCopyService.service';
import { getCodeEditor } from 'vscode/vscode/vs/editor/browser/editorBrowser';
import { IConfigurationService } from 'vscode/vscode/vs/platform/configuration/common/configuration.service';
var MainThreadTextEditors_1;
let MainThreadTextEditors = class MainThreadTextEditors {
static { MainThreadTextEditors_1 = this; }
static { this.INSTANCE_COUNT = 0; }
constructor(_editorLocator, extHostContext, _codeEditorService, _editorService, _editorGroupService, _configurationService) {
this._editorLocator = _editorLocator;
this._codeEditorService = _codeEditorService;
this._editorService = _editorService;
this._editorGroupService = _editorGroupService;
this._configurationService = _configurationService;
this._toDispose = ( new DisposableStore());
this._instanceId = String(++MainThreadTextEditors_1.INSTANCE_COUNT);
this._proxy = ( extHostContext.getProxy(ExtHostContext.ExtHostEditors));
this._textEditorsListenersMap = Object.create(null);
this._editorPositionData = null;
this._toDispose.add(this._editorService.onDidVisibleEditorsChange(() => this._updateActiveAndVisibleTextEditors()));
this._toDispose.add(this._editorGroupService.onDidRemoveGroup(() => this._updateActiveAndVisibleTextEditors()));
this._toDispose.add(this._editorGroupService.onDidMoveGroup(() => this._updateActiveAndVisibleTextEditors()));
this._registeredDecorationTypes = Object.create(null);
}
dispose() {
( Object.keys(this._textEditorsListenersMap)).forEach((editorId) => {
dispose(this._textEditorsListenersMap[editorId]);
});
this._textEditorsListenersMap = Object.create(null);
this._toDispose.dispose();
for (const decorationType in this._registeredDecorationTypes) {
this._codeEditorService.removeDecorationType(decorationType);
}
this._registeredDecorationTypes = Object.create(null);
}
handleTextEditorAdded(textEditor) {
const id = textEditor.getId();
const toDispose = [];
toDispose.push(textEditor.onPropertiesChanged((data) => {
this._proxy.$acceptEditorPropertiesChanged(id, data);
}));
this._textEditorsListenersMap[id] = toDispose;
}
handleTextEditorRemoved(id) {
dispose(this._textEditorsListenersMap[id]);
delete this._textEditorsListenersMap[id];
}
_updateActiveAndVisibleTextEditors() {
const editorPositionData = this._getTextEditorPositionData();
if (!equals(this._editorPositionData, editorPositionData)) {
this._editorPositionData = editorPositionData;
this._proxy.$acceptEditorPositionData(this._editorPositionData);
}
}
_getTextEditorPositionData() {
const result = Object.create(null);
for (const editorPane of this._editorService.visibleEditorPanes) {
const id = this._editorLocator.findTextEditorIdFor(editorPane);
if (id) {
result[id] = editorGroupToColumn(this._editorGroupService, editorPane.group);
}
}
return result;
}
async $tryShowTextDocument(resource, options) {
const uri = URI.revive(resource);
const editorOptions = {
preserveFocus: options.preserveFocus,
pinned: options.pinned,
selection: options.selection,
activation: options.preserveFocus ? EditorActivation.RESTORE : undefined,
override: EditorResolution.EXCLUSIVE_ONLY
};
const input = {
resource: uri,
options: editorOptions
};
const editor = await this._editorService.openEditor(input, columnToEditorGroup(this._editorGroupService, this._configurationService, options.position));
if (!editor) {
return undefined;
}
const editorControl = editor.getControl();
const codeEditor = getCodeEditor(editorControl);
return codeEditor ? this._editorLocator.getIdOfCodeEditor(codeEditor) : undefined;
}
async $tryShowEditor(id, position) {
const mainThreadEditor = this._editorLocator.getEditor(id);
if (mainThreadEditor) {
const model = mainThreadEditor.getModel();
await this._editorService.openEditor({
resource: model.uri,
options: { preserveFocus: false }
}, columnToEditorGroup(this._editorGroupService, this._configurationService, position));
return;
}
}
async $tryHideEditor(id) {
const mainThreadEditor = this._editorLocator.getEditor(id);
if (mainThreadEditor) {
const editorPanes = this._editorService.visibleEditorPanes;
for (const editorPane of editorPanes) {
if (mainThreadEditor.matches(editorPane)) {
await editorPane.group.closeEditor(editorPane.input);
return;
}
}
}
}
$trySetSelections(id, selections) {
const editor = this._editorLocator.getEditor(id);
if (!editor) {
return Promise.reject(illegalArgument(`TextEditor(${id})`));
}
editor.setSelections(selections);
return Promise.resolve(undefined);
}
$trySetDecorations(id, key, ranges) {
key = `${this._instanceId}-${key}`;
const editor = this._editorLocator.getEditor(id);
if (!editor) {
return Promise.reject(illegalArgument(`TextEditor(${id})`));
}
editor.setDecorations(key, ranges);
return Promise.resolve(undefined);
}
$trySetDecorationsFast(id, key, ranges) {
key = `${this._instanceId}-${key}`;
const editor = this._editorLocator.getEditor(id);
if (!editor) {
return Promise.reject(illegalArgument(`TextEditor(${id})`));
}
editor.setDecorationsFast(key, ranges);
return Promise.resolve(undefined);
}
$tryRevealRange(id, range, revealType) {
const editor = this._editorLocator.getEditor(id);
if (!editor) {
return Promise.reject(illegalArgument(`TextEditor(${id})`));
}
editor.revealRange(range, revealType);
return Promise.resolve();
}
$trySetOptions(id, options) {
const editor = this._editorLocator.getEditor(id);
if (!editor) {
return Promise.reject(illegalArgument(`TextEditor(${id})`));
}
editor.setConfiguration(options);
return Promise.resolve(undefined);
}
$tryApplyEdits(id, modelVersionId, edits, opts) {
const editor = this._editorLocator.getEditor(id);
if (!editor) {
return Promise.reject(illegalArgument(`TextEditor(${id})`));
}
return Promise.resolve(editor.applyEdits(modelVersionId, edits, opts));
}
$tryInsertSnippet(id, modelVersionId, template, ranges, opts) {
const editor = this._editorLocator.getEditor(id);
if (!editor) {
return Promise.reject(illegalArgument(`TextEditor(${id})`));
}
return Promise.resolve(editor.insertSnippet(modelVersionId, template, ranges, opts));
}
$registerTextEditorDecorationType(extensionId, key, options) {
key = `${this._instanceId}-${key}`;
this._registeredDecorationTypes[key] = true;
this._codeEditorService.registerDecorationType(`exthost-api-${extensionId}`, key, options);
}
$removeTextEditorDecorationType(key) {
key = `${this._instanceId}-${key}`;
delete this._registeredDecorationTypes[key];
this._codeEditorService.removeDecorationType(key);
}
$getDiffInformation(id) {
const editor = this._editorLocator.getEditor(id);
if (!editor) {
return Promise.reject(( new Error('No such TextEditor')));
}
const codeEditor = editor.getCodeEditor();
if (!codeEditor) {
return Promise.reject(( new Error('No such CodeEditor')));
}
const codeEditorId = codeEditor.getId();
const diffEditors = this._codeEditorService.listDiffEditors();
const [diffEditor] = diffEditors.filter(d => d.getOriginalEditor().getId() === codeEditorId || d.getModifiedEditor().getId() === codeEditorId);
if (diffEditor) {
return Promise.resolve(diffEditor.getLineChanges() || []);
}
const dirtyDiffContribution = codeEditor.getContribution('editor.contrib.dirtydiff');
if (dirtyDiffContribution) {
return Promise.resolve(dirtyDiffContribution.getChanges());
}
return Promise.resolve([]);
}
};
MainThreadTextEditors = MainThreadTextEditors_1 = ( __decorate([
( __param(2, ICodeEditorService)),
( __param(3, IEditorService)),
( __param(4, IEditorGroupsService)),
( __param(5, IConfigurationService))
], MainThreadTextEditors));
CommandsRegistry.registerCommand('_workbench.revertAllDirty', async function (accessor) {
const environmentService = accessor.get(IEnvironmentService);
if (!environmentService.extensionTestsLocationURI) {
throw ( new Error('Command is only available when running extension tests.'));
}
const workingCopyService = accessor.get(IWorkingCopyService);
for (const workingCopy of workingCopyService.dirtyWorkingCopies) {
await workingCopy.revert({ soft: true });
}
});
export { MainThreadTextEditors };