Розширення можливостей редактору коду за допомогою Language Server Protocol (LSP)

У якості єдиного редактора коду для внесення змін до регламенту реєстру та порівняння версій обрано рішення monaco-editor.

Регламент реєстру складається з набору декларативних описів важливих аспектів функціонування реєстру у вигляді конфігураційних файлів наступних типів:

  • XML

  • JSON

  • YAML

  • HTML

  • CSV

  • Groovy

Для забезпечення розширених можливостей по роботі з визначеними типами конфігураційних файлів через Систему Управління Регламентом Реєстру та формуванням єдиного підходу до реалізації підтримки нових типів файлів та мов, рекомендовано розглянути Language Server Protocol, який стандартизує інтеграцію зовнішніх мовних серверів та редактора коду.

Ключові вимоги до редактора коду

В залежності від природи окремої складової регламенту, редактор коду має реалізовувати особливі вимоги для спрощення використання на зниження вірогідності внесення помилок.

BPMN XML

  • Підтримка автодоповнення

  • Синтаксичний аналіз

  • Підтримка валідації вибраної schema

  • Підтримка автодоповнення для вибраної schema

Liquibase XML

  • Підтримка автодоповнення

  • Синтаксичний аналіз

  • Підтримка валідації вибраної schema

  • Підтримка автодоповнення для вибраної schema

JSON

  • Авто-доповнення

  • Синтаксичний аналіз

  • Підтримка валідації вибраної schema

  • Підтримка вибраної schema(автодоповнення)

YAML

  • …​

  • …​

HTML

  • Авто-доповнення

  • Підтримка автодоповнення директив із Thymeleaf

CSV

  • …​

  • …​

Groovy

  • Авто-доповнення

  • Підтримка автодоповнення для кастомних функцій

  • Синтаксичний аналіз

Опис Language Server Protocol

Протокол мовного сервера (LSP) визначає протокол, який використовується між редактором та мовним сервером, який забезпечує такі функції мови, як автоматичне завершення, перевірка помилок (діагностика), пошук усіх посилань тощо.

Мовний сервер призначений для надання інтелектуальних можливостей для певної мови та зв’язку з інструментами розробки через протокол, який забезпечує взаємодію між процесами.

Ідея, що лежить в основі протоколу мовного сервера (LSP), полягає в стандартизації протоколу для обміну даними між такими серверами та інструментами розробки.

lsp languages editors

Інтеграції редактора коду та мовних серверів

Обмін данними між редактор коду(monaco-editor) та мовним сервером, відбувається за домомогою WebSocket, в якості формату данних використовується JSON-RPC 2.0. Ілюстрація взаємодії нижче:

lsp illustration

Для цього був розроблений проксі веб сервер який використовує пакет vscode-ws-jsonrpc. Ми можемо настроїти наш сервер для будь-якої кількості мовних серверів. Для цього нам потрібно розшири файл languageServers.json.

  • ключем вказати мову

  • в поле name вказати повну назву мовного серверу

  • в поле command вказати команду для запуску процеса
    Приклад xml з викорристанням XML Language Server (LemMinX):

{
  "xml": { // ключ, вказати мову
    "name": "XML Language Server", // повна назва мовного серверу
    "command": "java", // команда для запуску процеса
    "args": [...] // аргументи для запуску процеса
  }
}

Кожен мовний сервер запускається як підпроцес, до якого підключається клієнт, передаючи назву мовного серверу в URL, наприклад wss://host/xml

Список доступних мовних серверів можна знайти тут