Компания Buf представила первый полнофункциональный production-ready LSP-сервер для Protobuf.

Language Server Protocol — стандартный API для интеграции поддержки языка в популярные IDE и текстовые редакторы вроде VSCode, IntelliJ или Neovim. LSP-сервер отвечает за переход к определению, автодополнение кода, поиск ссылок и подсветку синтаксиса с учётом семантики.

До сих пор Protobuf не имел такой же поддержки LSP, как другие крупные языки программирования. В Buf не преувеличивают значение проделанной работы, но называют это переломным моментом для разработки на Protobuf: впервые появилась полноценная поддержка в современных IDE, реализованная на основе Buf CLI.

В Buf считают Protobuf лучшим языком описания схем благодаря устоявшейся экосистеме библиотек и инструментов. Protobuf должен быть не только разумным выбором, но и самым простым. Именно поэтому компания выпускает LSP-сервер как часть семейства инструментов, дополняющих экосистему Protobuf — наряду с Protobuf-ES (используется в Chromium), Protovalidate, ConnectRPC и Buf Schema Registry. Независимо от проекта или сценария использования, разработка на Protobuf должна быть простым и очевидным решением.

Установка Buf LSP

VSCode — один из самых популярных графических редакторов, в котором отлично реализована поддержка LSP (сам протокол появился именно в VSCode). Чтобы использовать Buf LSP, достаточно установить расширение Buf. Оно автоматически задействует установленную версию Buf CLI (в которую встроен LSP-сервер) либо установит её при необходимости.

Neovim — любимый редактор инженеров Buf, и Buf LSP отлично работает с ним тоже. Достаточно установить Buf CLI и настроить Neovim на использование его в качестве LSP-сервера.

  1. Убедитесь, что установлен репозиторий nvim-lspconfig, который предоставляет конфигурацию LSP по умолчанию. Инструкции доступны здесь.
  2. Добавьте lspconfig.buf_ls.setup {} в .nvimrc.

Либо можно добавить следующее в init.lua (или другой конфигурационный файл):

vim.lsp.config('buf-lsp', {
    cmd = { 'buf', 'lsp', 'serve' },
    filetypes = { 'proto' },
    root_markers = { 'buf.yaml', '.git' },
})

Затем включите его командой vim.lsp.enable('buf-lsp') в .nvimrc.

Подробнее про LSP и Neovim можно прочитать здесь.

При использовании другого редактора нужно сначала разобраться, как в нём работает интеграция с LSP, и убедиться, что команда buf lsp serve запускает сервер.

Использование наработок Buf

Buf уже поддерживает собственный фронтенд компилятора Protobuf (часть, отвечающую за парсинг файлов и вызов плагинов, аналогично protoc) под названием protocompile. Эта реализация не просто полностью совместима со стандартом — она значительно быстрее и гибче protoc. Компилятор настолько хорош, что даже Google использует его наряду с protoc в некоторых частях своей огромной кодовой базы.

Для создания Buf LSP protocompile был выведен на новый уровень: разработан принципиально новый, query-driven фронтенд, который обеспечивает инкрементальную компиляцию и значительно более качественную диагностику. Например, в отличие от protoc, теперь корректно диагностируется дублирующийся модификатор repeated:

error: encountered more than one type modifier
  --> testdata/parser/type/repeated.proto:23:14
   |
23 |     repeated repeated M x4 = 4;
   |     -------- ^^^^^^^^ help: consider removing this
   |     |
   |     first one is here

Для точной диагностики подобных ошибок было спроектировано новое AST и промежуточное представление вместо использования FileDescriptorProto. Гибкость такого подхода позволяет легко реализовывать новые возможности языка по мере их появления в Protobuf, включая грядущие функции Editions 2024. Кроме того, представление экономно расходует память, что позволяет обрабатывать рабочие пространства с очень крупными модулями Buf.

Планы на будущее

Работа над Buf LSP не закончена. Диагностика будет продолжать улучшаться, а в LSP-сервер планируется добавить новые возможности:

  • Автоматическое добавление import как быстрое исправление.
  • Более тесная интеграция с buf.yaml (например, автоматический импорт модулей).
  • Автодополнение кода и поиск ссылок для пользовательских опций.
  • Автоматическое предложение номеров полей и значений enum.
  • Отдельная поддержка Protovalidate, включая подсветку синтаксиса для фрагментов CEL.

В Buf намерены и дальше расширять границы того, чего можно достичь с Protobuf, продвигая разработку на основе схем.

Тем, кому нужна помощь с внедрением стандартов для данных организации, предлагается связаться с командой Buf. Тем, кого привлекает создание качественных инструментов для разработчиков, стоит заглянуть на страницу вакансий.