Розширення можливостей редактору коду за допомогою Language Server Protocol (LSP)
У якості єдиного редактора коду для внесення змін до регламенту реєстру та порівняння версій обрано рішення monaco-editor.
Регламент реєстру складається з набору декларативних описів важливих аспектів функціонування реєстру у вигляді конфігураційних файлів наступних типів:
-
XML
-
JSON
-
YAML
-
HTML
-
CSV
-
Groovy
Для забезпечення розширених можливостей по роботі з визначеними типами конфігураційних файлів через Систему Управління Регламентом Реєстру та формуванням єдиного підходу до реалізації підтримки нових типів файлів та мов, рекомендовано розглянути Language Server Protocol, який стандартизує інтеграцію зовнішніх мовних серверів та редактора коду.
Ключові вимоги до редактора коду
В залежності від природи окремої складової регламенту, редактор коду має реалізовувати особливі вимоги для спрощення використання на зниження вірогідності внесення помилок.
BPMN XML
-
Підтримка автодоповнення
-
Синтаксичний аналіз
-
Підтримка валідації вибраної schema
-
Підтримка автодоповнення для вибраної schema
Liquibase XML
-
Підтримка автодоповнення
-
Синтаксичний аналіз
-
Підтримка валідації вибраної schema
-
Підтримка автодоповнення для вибраної schema
Опис Language Server Protocol
Протокол мовного сервера (LSP) визначає протокол, який використовується між редактором та мовним сервером, який забезпечує такі функції мови, як автоматичне завершення, перевірка помилок (діагностика), пошук усіх посилань тощо.
Мовний сервер призначений для надання інтелектуальних можливостей для певної мови та зв’язку з інструментами розробки через протокол, який забезпечує взаємодію між процесами.
Ідея, що лежить в основі протоколу мовного сервера (LSP), полягає в стандартизації протоколу для обміну даними між такими серверами та інструментами розробки.
![lsp languages editors](../../../_images/architecture-workspace/research/admin-portal/lsp-languages-editors.png)
Інтеграції редактора коду та мовних серверів
Обмін данними між редактор коду(monaco-editor) та мовним сервером, відбувається за домомогою WebSocket, в якості формату данних використовується JSON-RPC 2.0. Ілюстрація взаємодії нижче:
![lsp illustration](../../../_images/architecture-workspace/research/admin-portal/lsp-illustration.png)
Для цього був розроблений проксі веб сервер який використовує пакет vscode-ws-jsonrpc. Ми можемо настроїти наш сервер для будь-якої кількості мовних серверів. Для цього нам потрібно розшири файл languageServers.json.
-
ключем вказати мову
-
в поле name вказати повну назву мовного серверу
-
в поле command вказати команду для запуску процеса
Приклад xml з викорристанням XML Language Server (LemMinX):
{
"xml": { // ключ, вказати мову
"name": "XML Language Server", // повна назва мовного серверу
"command": "java", // команда для запуску процеса
"args": [...] // аргументи для запуску процеса
}
}
Кожен мовний сервер запускається як підпроцес, до якого підключається клієнт, передаючи назву мовного серверу в URL, наприклад wss://host/xml
Список доступних мовних серверів можна знайти тут |