Utilizarea google-java-format cu VS Code

Am făcut recent ceva dezvoltare Java, iar editorii mei preferați sunt Visual Studio Code și Neovim. Configurația mea vim este configurată pentru a formata fișierele sursă Java folosind google-java-format, dar mă străduiam să obțin același comportament în Visual Studio Code. Această postare explorează modul de formatare a fișierelor sursă Java utilizând google-java-format în VS Code.

TL;DR

Instalați emeraldwalk/vscode-runonsave:

$ code --install-extension emeraldwalk.RunOnSave

Instalați google-java-format pentru sistemul dumneavoastră:

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

Configurați RunOnSave în setările Visual Studio Code:

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

Background

Google publică un ghid de stil Google Java verbos, precum și google-java-format care reformatează codul Java în conformitate cu acest ghid de stil. Formatorul este disponibil ca un JAR Java și prin intermediul managerilor de pachete populare. De exemplu, pentru a instala formatorul pe OS X:

$ brew install google-java-format

Apoi, pentru a formata fișierele sursă Java, treceți-le ca argumente la comanda:

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

Lucrări existente

Există deja plugin-uri populare pentru google-java-format pentru IDE-uri precum Eclipse și IntelliJ. Din păcate, nu există niciunul oficial pentru Visual Studio Code la momentul scrierii acestui articol. Înainte de a veni cu propria mea soluție, am făcut câteva căutări pe Internet.

Cel mai popular răspuns vine de la redhat-developer/vscode-java#419 care ne îndreaptă către o pagină Wiki cu instrucțiuni de editare a unor configurări pentru 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",}

Aceasta va instrui editorul să folosească „GoogleStyle” atunci când formatează codul în loc de stilul încorporat. Acest lucru părea să se potrivească foarte bine, deoarece folosesc deja suportul pentru limbajul Java de la RedHat.

În timp ce acest lucru schimbă formatul implicit al codului, în testele mele nu s-a potrivit cu rezultatul executării google-java-format direct din linia de comandă. Mai rău, a modificat lucruri precum antetele de licență, făcându-le invalide.

Am dat și peste Dev-Snippets/vscode-google-java-format-provider, care părea promițător, dar nu am reușit să-l fac să se înregistreze ca formator (și nu sunt singurul).

Soluție

Am pornit pe calea scrierii propriului meu plugin Visual Studio Code pentru a rula google-java-format ca formator. După aproximativ 10 minute de exercițiu, mi-am dat seama că acest plugin va fi destul de prostesc:

  1. Detectați dacă fișierul este Java
  2. Executați google-java-format -i ${file}
  3. Raportează orice eroare utilizatorului

Acești pași sunt, în esență, „executați o comandă la salvare”, și se pare că cineva a scris deja o extensie! emeraldwalk/vscode-runonsave citește setările Visual Studio Code, potrivește fișierele după o expresie regulată și apoi execută o comandă furnizată de utilizator. Aceasta s-a dovedit a fi o soluție minimă, dar perfectă!

Am instalat RunOnSave și google-java-format pe Mac-ul meu:

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

Apoi am configurat RunOnSave pentru a rula google-java-format pe fișierele care se termină în .java în setările Visual Studio Code:

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

Aceasta necesită ca google-java-format să fie în $PATH meu. Dacă nu era, aș putea specifica în schimb calea completă către binar:

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

După ce am petrecut câteva ore încercând să ajung la paritate între google-java-format și formatOnSave din Visual Studio Code, simt că am ajuns la o soluție perfectă.