Protobuf heeft eindelijk LSP-ondersteuning. Graag gedaan.

Buf kondigt met trots de eerste volledig functionele, productie-waardige LSP-server voor Protobuf aan.

Het Language Server Protocol (LSP) is de standaard API voor het integreren van taalondersteuning in je favoriete IDE of teksteditor, zoals VSCode, IntelliJ of Neovim. Een LSP-server levert de intelligentie die functies zoals 'ga naar definitie' (go to definition), codeaanvulling, het vinden van referenties en semantisch bewuste syntaxhighlighting mogelijk maakt.

Tot nu toe miste Protobuf de LSP-ondersteuning die andere grote programmeertalen wel hebben. Zonder ons eigen werk te overschatten, is dit een game-changer voor Protobuf-ontwikkeling: Protobuf heeft nu voor het eerst moderne IDE-ondersteuning, volledig aangedreven door de Buf CLI.

Bij Buf geloven we dat Protobuf de beste schemataal is, dankzij het gevestigde ecosysteem van bibliotheken en tools. Protobuf zou niet alleen de slimme keuze moeten zijn, maar ook de gemakkelijkste keuze. Daarom brengen we de Buf LSP-server uit als onderdeel van onze familie van tools die het Protobuf-ecosysteem completeren, waaronder Protobuf-ES (gebruikt in Chromium!), Protovalidate, ConnectRPC en de Buf Schema Registry. Ongeacht je project of use-case, ontwikkelen met Protobuf zou de gemakkelijke en voor de hand liggende keuze moeten zijn.

De Buf LSP installeren

VSCode

VSCode is een van de populairste grafische editors en heeft uitstekende LSP-ondersteuning (LSP is oorspronkelijk ontstaan bij VSCode). Om de Buf LSP te gebruiken, installeer je simpelweg de Buf-extensie. Deze maakt automatisch gebruik van je geïnstalleerde versie van de Buf CLI (die de LSP-server bevat), of installeert deze indien nodig.

Neovim

Neovim is de favoriete editor van de Buf-engineers, en de Buf LSP werkt hier ook uitstekend mee. Je hoeft alleen de Buf CLI te installeren en Neovim zo te configureren dat het deze als LSP-server gebruikt.

Zorg ervoor dat je de nvim-lspconfig repository hebt geïnstalleerd, die standaard LSP-configuratieopties biedt. Volg hiervoor de instructies op de betreffende pagina.

Voeg vervolgens lspconfig.buf_ls.setup {} toe aan je .nvimrc.

Als alternatief kun je het volgende toevoegen in init.lua (of een ander configuratiebestand):

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

Vervolgens kun je het activeren met vim.lsp.enable('buf-lsp') in je .nvimrc.

Andere editors

Als je een andere editor gebruikt, zoek dan eerst uit hoe LSP-integratie werkt en zorg ervoor dat het commando buf lsp serve wordt uitgevoerd om de server te starten.

Gebruik van onze toolchain

Buf beheert al een Protobuf-compiler frontend (het onderdeel dat bestanden parseert en plugins aanroept, zoals protoc), die we protocompile noemen. Onze implementatie is niet alleen volledig compliant, maar ook veel sneller en flexibeler dan protoc. Onze compiler is zo goed dat zelfs Google deze naast protoc gebruikt in sommige delen van hun enorme codebase.

Om de Buf LSP te bouwen, hebben we protocompile naar een hoger niveau getild. We hebben een gloednieuwe, query-gestuurde frontend ontwikkeld die incrementele compilatie en veel betere diagnostiek mogelijk maakt. In tegenstelling tot protoc kunnen we bijvoorbeeld een dubbele repeated-modifier correct diagnosticeren:

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

We hebben een nieuwe AST (Abstract Syntax Tree) en intermediate representatie ontworpen voor het nauwkeurig diagnosticeren van deze fouten, in plaats van FileDescriptorProto te gebruiken. De flexibiliteit hiervan maakt het voor ons eenvoudig om nieuwe taalfuncties te implementeren zodra deze aan Protobuf worden toegevoegd, zoals de aankomende functies in Editions 2024. Daarnaast is het geheugenefficiënt, waardoor het workspaces kan verwerken die zeer grote Buf-modules bevatten.

Onze toezegging

Ons werk aan de Buf LSP is nog niet voltooid. We verbeteren voortdurend onze diagnostiek en zijn van plan meer functies aan de LSP-server toe te voegen:

  • Het toevoegen van imports als een automatische correctie (automatic fix).
  • Nauwere integratie met buf.yaml (zoals het automatisch importeren van modules).
  • Codeaanvulling en referentie-opzoeking voor aangepaste opties.
  • Automatische suggesties voor veld- en enum-nummers.
  • Specifieke Protovalidate-ondersteuning, inclusief syntaxhighlighting voor CEL-snippets.

Bij Buf zullen we altijd de grenzen verleggen van wat je met Protobuf kunt bereiken, om schema-gestuurde ontwikkeling voor iedereen mogelijk te maken.