Google-java-format gebruiken met VS Code

Ik heb de laatste tijd wat Java ontwikkeling gedaan, en mijn voorkeur editors stuiteren tussen Visual Studio Code en Neovim. Mijn vim setup is geconfigureerd om Java bronbestanden te formatteren met google-java-format, maar ik had moeite om hetzelfde gedrag te bereiken in Visual Studio Code. Deze post onderzoekt hoe je Java bronbestanden kunt formatteren met google-java-format in VS Code.

TL;DR

Installeer emeraldwalk/vscode-runonsave:

$ code --install-extension emeraldwalk.RunOnSave

Installeer google-java-format voor uw systeem:

# Example using Homebrew on OS X$ brew install google-java-format

Configureer RunOnSave in de instellingen van Visual Studio Code:

{ "emeraldwalk.runonsave": { "commands": , },}

Achtergrond

Google publiceert een uitgebreide Google Java-stijlgids en google-java-format waarmee Java-code opnieuw wordt geformatteerd volgens die stijlgids. De formatteerder is beschikbaar als een Java JAR en via populaire pakketbeheerders. Om de formatter bijvoorbeeld op OS X te installeren:

$ brew install google-java-format

Dan, om Java bronbestanden te formatteren, geef je ze als argumenten mee aan het commando:

$ google-java-format -i ./MyClass.java

Bestaand werk

Er zijn al populaire plugins voor google-java-format voor IDE’s zoals Eclipse en IntelliJ. Helaas bestaan er op het moment van schrijven nog geen officiële plugins voor Visual Studio Code. Voordat ik met mijn eigen oplossing kwam, heb ik wat op internet gezocht.

Het populairste antwoord komt van redhat-developer/vscode-java#419 die ons naar een Wiki-pagina leidt met instructies om een aantal Visual Studio Code-configuraties te bewerken:

{ "java.format.settings.profile": "GoogleStyle", "java.format.settings.url": "https://raw.githubusercontent.com/google/styleguide/gh-pages/eclipse-java-google-style.xml",}

Dit zal de editor instrueren om de “GoogleStyle” te gebruiken bij het formatteren van code in plaats van de ingebouwde stijl. Dit leek mij zeer geschikt, omdat ik al gebruik maak van RedHat’s Java Language Support.

Hoewel dit de standaard opmaak van de code verandert, kwam het in mijn tests niet overeen met de uitvoer van het uitvoeren van google-java-format direct vanaf de opdrachtregel. Erger nog, het veranderde dingen zoals licentie headers, waardoor ze ongeldig werden.

Ik stuitte ook op Dev-Snippets/vscode-google-java-format-provider, die veelbelovend leek, maar ik was niet in staat om het te laten registreren als formatter (en ik ben niet de enige).

Oplossing

Ik begon op het pad van het schrijven van mijn eigen Visual Studio Code plugin om google-java-format uit te voeren als een formatter. Na ongeveer 10 minuten oefenen realiseerde ik me dat deze plugin nogal dom zou zijn:

  1. Detecteer of het bestand Java is
  2. Run google-java-format -i ${file}
  3. Raporteer eventuele fouten terug naar de gebruiker

Deze stappen zijn in wezen “voer een commando uit bij het opslaan”, en het blijkt dat iemand al een extensie heeft geschreven! emeraldwalk/vscode-runonsave leest Visual Studio Code instellingen, matcht bestanden op een reguliere expressie, en voert dan een door de gebruiker gegeven commando uit. Dit bleek een minimale maar perfecte oplossing te zijn!

Ik installeerde RunOnSave en google-java-format op mijn Mac:

$ code --install-extension emeraldwalk.RunOnSave$ brew install google-java-format

Daarna configureerde ik RunOnSave om google-java-format uit te voeren op bestanden die eindigen op .java in de Visual Studio Code instellingen:

{ "emeraldwalk.runonsave": { "commands": , },}

Dit vereist dat google-java-format in mijn $PATH staat. Als dat niet het geval is, kan ik in plaats daarvan het volledige pad naar het binaire bestand opgeven:

{ "cmd": "/usr/local/bin/google-java-format --replace ${file}"}

Na een paar uur te hebben geprobeerd om gelijkheid te bereiken tussen google-java-formaat en Visual Studio Code’s formatOnSave, heb ik het gevoel dat ik een perfecte oplossing heb bereikt.