Перейти к содержимому

Языковой сервер

Wippy включает встроенный LSP-сервер (Language Server Protocol), предоставляющий функции IDE для Lua-кода. Сервер работает как часть среды выполнения Wippy и подключается к редакторам через TCP или HTTP.

  • Автодополнение кода с учётом типов
  • Информация при наведении: типы и сигнатуры
  • Переход к определению
  • Поиск ссылок
  • Символы документа и рабочего пространства
  • Иерархия вызовов (входящие и исходящие)
  • Диагностика в реальном времени (ошибки парсинга, ошибки типов)
  • Подсказки по сигнатурам параметров функций

Включите LSP-сервер в .wippy.yaml:

version: "1.0"
lua:
type_system:
enabled: true
lsp:
enabled: true
address: ":7777"
ПолеПо умолчаниюОписание
enabledfalseВключить TCP-сервер
address:7777Адрес TCP для прослушивания
http_enabledfalseВключить HTTP-транспорт
http_address:7778Адрес HTTP для прослушивания
http_path/lspПуть HTTP-эндпоинта
http_allow_origin*Разрешённый источник CORS
max_message_bytes8388608Максимальный размер входящего сообщения (байт)

TCP-сервер использует JSON-RPC 2.0 со стандартным форматом LSP-сообщений (заголовки Content-Length). Это основной транспорт для интеграции с редакторами.

HTTP-транспорт принимает POST-запросы с JSON-RPC-нагрузкой. Полезен для браузерных редакторов и веб-инструментов. Заголовки CORS включены для кросс-доменного доступа.

lsp:
enabled: true
http_enabled: true
http_address: ":7778"
http_path: "/lsp"
http_allow_origin: "*"

LSP-сервер использует схему URI wippy:// для идентификации записей реестра:

wippy://namespace:entry_name

Редакторы сопоставляют эти URI с идентификаторами записей в реестре. Принимаются как формат wippy://, так и формат namespace:entry_name.

LSP-сервер поддерживает индекс всех записей кода для быстрого поиска. Индексирование происходит в фоновом режиме с использованием нескольких потоков.

Ключевые особенности:

  • Записи индексируются в порядке зависимостей (зависимости сначала)
  • Изменения вызывают переиндексацию затронутых записей
  • Несохранённые изменения в редакторе хранятся в оверлее
  • Индекс инкрементальный - повторно обрабатываются только изменённые записи
МетодОписание
initializeСогласование возможностей
textDocument/didOpenОтслеживание открытых документов
textDocument/didChangeПолная синхронизация документа
textDocument/didCloseОсвобождение документов
textDocument/hoverИнформация о типе под курсором
textDocument/definitionПереход к определению
textDocument/referencesПоиск всех ссылок
textDocument/completionАвтодополнение кода
textDocument/signatureHelpСигнатуры функций
textDocument/diagnosticДиагностика файла
textDocument/documentSymbolСимволы файла
workspace/symbolГлобальный поиск символов
textDocument/prepareCallHierarchyИерархия вызовов
callHierarchy/incomingCallsПоиск вызывающих
callHierarchy/outgoingCallsПоиск вызываемых

Механизм автодополнения разрешает типы через граф кода. Он предоставляет:

  • Дополнение членов после . и : (поля, методы)
  • Дополнение локальных переменных
  • Дополнение символов уровня модуля
  • Триггерные символы: ., :

Диагностика вычисляется при индексировании и включает:

  • Ошибки парсинга (синтаксические проблемы)
  • Ошибки проверки типов (несоответствия, неопределённые символы)
  • Уровни серьёзности: error, warning, information, hint

Диагностика обновляется по мере набора текста через систему оверлеев документов.

  • Линтер - Проверка кода из командной строки
  • Типы - Документация по системе типов
  • Конфигурация - Конфигурация среды выполнения