@codingame/monaco-vscode-extensions-service-override
Version:
VSCode public API plugged on the monaco editor - extensions service-override
80 lines (77 loc) • 4.05 kB
JavaScript
import { __decorate, __param } from 'vscode/external/tslib/tslib.es6.js';
import { onUnexpectedError } from 'vscode/vscode/vs/base/common/errors';
import { DisposableMap, dispose } from 'vscode/vscode/vs/base/common/lifecycle';
import { URI } from 'vscode/vscode/vs/base/common/uri';
import { EditOperation } from 'vscode/vscode/vs/editor/common/core/editOperation';
import { Range } from 'vscode/vscode/vs/editor/common/core/range';
import { IEditorWorkerService } from 'vscode/vscode/vs/editor/common/services/editorWorker';
import { IModelService } from 'vscode/vscode/vs/editor/common/services/model';
import { ILanguageService } from 'vscode/vscode/vs/editor/common/languages/language';
import { ITextModelService } from 'vscode/vscode/vs/editor/common/services/resolverService';
import { extHostNamedCustomer } from '../../services/extensions/common/extHostCustomers.js';
import { ExtHostContext, MainContext } from 'vscode/vscode/vs/workbench/api/common/extHost.protocol';
import { CancellationTokenSource } from 'vscode/vscode/vs/base/common/cancellation';
let MainThreadDocumentContentProviders = class MainThreadDocumentContentProviders {
constructor(extHostContext, _textModelResolverService, _languageService, _modelService, _editorWorkerService) {
this._textModelResolverService = _textModelResolverService;
this._languageService = _languageService;
this._modelService = _modelService;
this._editorWorkerService = _editorWorkerService;
this._resourceContentProvider = ( new DisposableMap());
this._pendingUpdate = ( new Map());
this._proxy = ( extHostContext.getProxy(ExtHostContext.ExtHostDocumentContentProviders));
}
dispose() {
this._resourceContentProvider.dispose();
dispose(( this._pendingUpdate.values()));
}
$registerTextContentProvider(handle, scheme) {
const registration = this._textModelResolverService.registerTextModelContentProvider(scheme, {
provideTextContent: (uri) => {
return this._proxy.$provideTextDocumentContent(handle, uri).then(value => {
if (typeof value === 'string') {
const firstLineText = value.substr(0, 1 + value.search(/\r?\n/));
const languageSelection = this._languageService.createByFilepathOrFirstLine(uri, firstLineText);
return this._modelService.createModel(value, languageSelection, uri);
}
return null;
});
}
});
this._resourceContentProvider.set(handle, registration);
}
$unregisterTextContentProvider(handle) {
this._resourceContentProvider.deleteAndDispose(handle);
}
async $onVirtualDocumentChange(uri, value) {
const model = this._modelService.getModel(URI.revive(uri));
if (!model) {
return;
}
const pending = this._pendingUpdate.get(model.id);
pending?.cancel();
const myToken = ( new CancellationTokenSource());
this._pendingUpdate.set(model.id, myToken);
try {
const edits = await this._editorWorkerService.computeMoreMinimalEdits(model.uri, [{ text: value, range: model.getFullModelRange() }]);
this._pendingUpdate.delete(model.id);
if (myToken.token.isCancellationRequested) {
return;
}
if (edits && edits.length > 0) {
model.applyEdits(( edits.map(edit => EditOperation.replace(Range.lift(edit.range), edit.text))));
}
}
catch (error) {
onUnexpectedError(error);
}
}
};
MainThreadDocumentContentProviders = __decorate([
extHostNamedCustomer(MainContext.MainThreadDocumentContentProviders),
( __param(1, ITextModelService)),
( __param(2, ILanguageService)),
( __param(3, IModelService)),
( __param(4, IEditorWorkerService))
], MainThreadDocumentContentProviders);
export { MainThreadDocumentContentProviders };