/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; import Promise = monaco.Promise; import Thenable = monaco.Thenable; import IWorkerContext = monaco.worker.IWorkerContext; import * as jsonService from 'vscode-json-languageservice'; import * as ls from 'vscode-languageserver-types'; class PromiseAdapter implements jsonService.Thenable { private wrapped: monaco.Promise; constructor(executor: (resolve: (value?: T | jsonService.Thenable) => void, reject: (reason?: any) => void) => void) { this.wrapped = new monaco.Promise(executor); } public then(onfulfilled?: (value: T) => TResult | jsonService.Thenable, onrejected?: (reason: any) => void): jsonService.Thenable { return this.wrapped.then(onfulfilled, onrejected); } public getWrapped(): monaco.Promise { return this.wrapped; } public cancel() : void { this.wrapped.cancel(); } public static resolve(v: T) : jsonService.Thenable { return monaco.Promise.as(v); } public static reject(v: T) : jsonService.Thenable { return monaco.Promise.wrapError(v); } public static all(values: jsonService.Thenable[]): jsonService.Thenable { return monaco.Promise.join(values); } } function toMonacoPromise(thenable: jsonService.Thenable) : Thenable { if (thenable instanceof PromiseAdapter) { return thenable.getWrapped(); } return thenable; } export class JSONWorker { private _ctx:IWorkerContext; private _languageService: jsonService.LanguageService; private _languageSettings: jsonService.LanguageSettings; private _languageId: string; constructor(ctx:IWorkerContext, createData: ICreateData) { this._ctx = ctx; this._languageSettings = createData.languageSettings; this._languageId = createData.languageId; this._languageService = jsonService.getLanguageService({ promiseConstructor: PromiseAdapter }); this._languageService.configure(this._languageSettings); } doValidation(uri: string): Thenable { let document = this._getTextDocument(uri); let jsonDocument = this._languageService.parseJSONDocument(document); return this._languageService.doValidation(document, jsonDocument); } doComplete(uri: string, position: ls.Position): Thenable { let document = this._getTextDocument(uri); let jsonDocument = this._languageService.parseJSONDocument(document); return this._languageService.doComplete(document, position, jsonDocument); } doResolve(item: ls.CompletionItem): Thenable { return this._languageService.doResolve(item); } doHover(uri: string, position: ls.Position): Thenable { let document = this._getTextDocument(uri); let jsonDocument = this._languageService.parseJSONDocument(document); return this._languageService.doHover(document, position, jsonDocument); } format(uri: string, range: ls.Range, options: ls.FormattingOptions): Thenable { let document = this._getTextDocument(uri); let textEdits = this._languageService.format(document, range, options); return Promise.as(textEdits); } resetSchema(uri: string): Thenable { return Promise.as(this._languageService.resetSchema(uri)); } findDocumentSymbols(uri: string): Promise { let document = this._getTextDocument(uri); let jsonDocument = this._languageService.parseJSONDocument(document); let symbols = this._languageService.findDocumentSymbols(document, jsonDocument); return Promise.as(symbols); } private _getTextDocument(uri: string): ls.TextDocument { let models = this._ctx.getMirrorModels(); for (let model of models) { if (model.uri.toString() === uri) { return ls.TextDocument.create(uri, this._languageId, model.version, model.getValue()); } } return null; } } export interface ICreateData { languageId: string; languageSettings: jsonService.LanguageSettings; } export function create(ctx:IWorkerContext, createData: ICreateData): JSONWorker { return new JSONWorker(ctx, createData); }