Компания 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-сервера.
- Убедитесь, что установлен репозиторий
nvim-lspconfig, который предоставляет конфигурацию LSP по умолчанию. Инструкции доступны здесь. - Добавьте
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. Тем, кого привлекает создание качественных инструментов для разработчиков, стоит заглянуть на страницу вакансий.