Компания Buf представила Buf LSP server — первый полноценный production-grade LSP server для Protobuf. LSP — это стандартный API для интеграции языковой поддержки в редакторы вроде VSCode, IntelliJ или Neovim. Сервер отвечает за переход к определению, автодополнение, поиск ссылок и семантическую подсветку синтаксиса. Раньше у Protobuf не было такой же IDE-поддержки, как у других популярных языков. Теперь она появилась, и работает через Buf CLI.
Buf считает Protobuf лучшим языком схем и хочет сделать его ещё и самым простым выбором. Новый LSP входит в семейство инструментов Buf вместе с Protobuf-ES (он используется в Chromium), Protovalidate, ConnectRPC и Buf Schema Registry.
Попробовать можно так. В VSCode достаточно установить Buf extension — он сам использует установленный Buf CLI (внутри него живёт LSP server) или установит его при необходимости. В Neovim нужно поставить Buf CLI и настроить LSP через nvim-lspconfig: добавить lspconfig.buf_ls.setup {} в .nvimrc, либо прописать конфигурацию с cmd = {'buf', 'lsp', 'serve'}, filetypes = {'proto'} и root_markers = {'buf.yaml', '.git'}, а затем включить vim.lsp.enable('buf-lsp'). В других редакторах достаточно запустить команду buf lsp serve.
В основе LSP лежит protocompile — собственный фронтенд компилятора Protobuf от Buf. Он полностью совместим с protoc, но быстрее и гибче. Google использует его вместе с protoc в некоторых частях своей огромной кодовой базы.
Для LSP инженеры Buf доработали protocompile: новый query-driven фронтенд поддерживает инкрементальную компиляцию и даёт более точную диагностику. Например, в отличие от protoc, сервер корректно находит повторяющийся repeated-модификатор и подсказывает, что его нужно убрать. Для этого Buf спроектировала новый AST и промежуточное представление вместо FileDescriptorProto. Такая архитектура упрощает добавление новых возможностей Protobuf, включая будущие фичи Editions 2024, и экономит память при работе с большими Buf-модулями.
На этом Buf останавливаться не собирается. В планах: автоматический фикс для import, тесная интеграция с buf.yaml (например, автоматический импорт модулей), автодополнение и поиск ссылок для кастомных опций, подсказки номеров полей и enum, а также отдельная поддержка Protovalidate с подсветкой CEL-фрагментов.