Utilizzo di google-java-format con VS Code

Ho fatto un po’ di sviluppo Java recentemente, e i miei editor preferiti rimbalzano tra Visual Studio Code e Neovim. La mia configurazione di vim è configurata per formattare i file sorgente Java usando google-java-format, ma stavo lottando per ottenere lo stesso comportamento in Visual Studio Code. Questo post esplora come formattare i file sorgente Java usando google-java-format in VS Code.

TL;DR

Installa emeraldwalk/vscode-runonsave:

$ code --install-extension emeraldwalk.RunOnSave

Installa google-java-format per il tuo sistema:

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

Configura RunOnSave nelle impostazioni di Visual Studio Code:

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

Sfondo

Google pubblica una verbosa guida di stile Google Java così come google-java-format che riformatta il codice Java secondo quella guida di stile. Il formattatore è disponibile come JAR Java e tramite i più diffusi gestori di pacchetti. Per esempio, per installare il formattatore su OS X:

$ brew install google-java-format

Poi, per formattare i file sorgente Java, passarli come argomenti al comando:

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

Lavoro esistente

Ci sono già plugin popolari per google-java-format per IDE come Eclipse e IntelliJ. Sfortunatamente non ne esistono di ufficiali per Visual Studio Code al momento di questo scritto. Prima di arrivare alla mia soluzione, ho fatto qualche ricerca su Internet.

La risposta più popolare viene da redhat-developer/vscode-java#419 che ci indirizza a una pagina Wiki con le istruzioni per modificare alcune configurazioni di Visual Studio Code:

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

Questo istruirà l’editor a usare il “GoogleStyle” quando formatta il codice invece dello stile integrato. Questo sembra un’ottima soluzione, dato che sto già usando il Java Language Support di RedHat.

Mentre questo cambia il formato predefinito del codice, nei miei test non corrisponde all’output dell’esecuzione di google-java-format direttamente dalla linea di comando. Peggio, ha modificato cose come le intestazioni di licenza, rendendole non valide.

Mi sono anche imbattuto in Dev-Snippets/vscode-google-java-format-provider, che sembrava promettente, ma non sono riuscito a farlo registrare come formattatore (e non sono l’unico).

Soluzione

Ho iniziato a scrivere il mio plugin di Visual Studio Code per eseguire google-java-format come formattatore. Dopo circa 10 minuti di esercizio, mi sono reso conto che questo plugin sarebbe stato abbastanza stupido:

  1. Rileva se il file è Java
  2. Esegui google-java-format -i ${file}
  3. Riporta eventuali errori all’utente

Questi passi sono essenzialmente “eseguire un comando al salvataggio”, e risulta che qualcuno ha già scritto una estensione! emeraldwalk/vscode-runonsave legge le impostazioni di Visual Studio Code, abbina i file su un’espressione regolare e poi esegue un comando fornito dall’utente. Questa si è rivelata una soluzione minima ma perfetta!

Ho installato RunOnSave e google-java-format sul mio Mac:

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

Poi ho configurato RunOnSave per eseguire google-java-format sui file che finiscono in .java nelle impostazioni di Visual Studio Code:

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

Questo richiede che google-java-format sia nel mio $PATH. Se non lo fosse, potrei invece specificare il percorso completo del binario:

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

Dopo aver passato alcune ore a cercare di raggiungere la parità tra google-java-format e il formatOnSave di Visual Studio Code, sento di aver raggiunto una soluzione perfetta.