Použití google-java-formátu ve VS Code

V poslední době se věnuji vývoji v Javě a nejraději volím editory Visual Studio Code a Neovim. Moje nastavení vimu je nakonfigurováno tak, aby formátovalo zdrojové soubory Javy pomocí google-java-format, ale měl jsem problém dosáhnout stejného chování ve Visual Studio Code. Tento příspěvek zkoumá, jak formátovat zdrojové soubory jazyka Java pomocí google-java-format ve VS Code.

TL;DR

Instalace emeraldwalk/vscode-runonsave:

$ code --install-extension emeraldwalk.RunOnSave

Instalace google-java-format pro váš systém:

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

Konfigurace RunOnSave v nastavení Visual Studio Code:

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

Pozadí

Google publikuje slovní průvodce styly Google Java a také google-java-format, který přeformátuje kód Java podle tohoto průvodce. Formátovač je k dispozici ve formátu Java JAR a prostřednictvím populárních správců balíčků. Chcete-li například nainstalovat formátovač v systému OS X:

$ brew install google-java-format

Chcete-li formátovat zdrojové soubory jazyka Java, předejte je jako argumenty příkazu:

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

Existující práce

Pro prostředí IDE, jako jsou Eclipse a IntelliJ, již existují populární zásuvné moduly google-java-format. Pro Visual Studio Code bohužel v době psaní tohoto článku žádné oficiální neexistují. Než jsem přišel s vlastním řešením, trochu jsem hledal na internetu.

Nejpopulárnější odpověď pochází z redhat-developer/vscode-java#419, která nás odkazuje na stránku Wiki s návodem na úpravu některých konfigurací 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",}

Tím editoru nařídíte, aby při formátování kódu používal „GoogleStyle“ místo vestavěného stylu. To se mi zdálo jako velmi vhodné, protože již používám podporu jazyka Java od RedHatu.

Přestože se tím změní výchozí formátování kódu, při mém testování se neshodovalo s výstupem při spuštění google-java-format přímo z příkazového řádku. A co hůř, měnilo to věci jako licenční hlavičky, čímž se stávaly neplatnými.

Narazil jsem také na Dev-Snippets/vscode-google-java-format-provider, který vypadal slibně, ale nepodařilo se mi ho zaregistrovat jako formátovač (a nejsem jediný).

Řešení

Pustil jsem se cestou psaní vlastního zásuvného modulu Visual Studio Code pro spuštění google-java-format jako formátovače. Asi po deseti minutách cvičení jsem si uvědomil, že tento zásuvný modul bude docela hloupý:

  1. Zjistit, zda je soubor Java
  2. Spustit google-java-format -i ${file}
  3. Hlásit případné chyby zpět uživateli

Tyto kroky jsou v podstatě „spustit příkaz při uložení“, a ukázalo se, že někdo už napsal rozšíření! emeraldwalk/vscode-runonsave načte nastavení Visual Studio Code, porovná soubory na základě regulárního výrazu a poté spustí příkaz zadaný uživatelem. To se ukázalo jako minimální, ale dokonalé řešení!

Nainstaloval jsem RunOnSave a google-java-format na svůj Mac:

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

Poté jsem nakonfiguroval RunOnSave tak, aby spouštěl google-java-format na soubory, které v nastavení Visual Studio Code končí na .java:

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

To vyžaduje, aby google-java-format byl v mém $PATH. Pokud by tam nebyl, mohl bych místo něj zadat úplnou cestu k binárnímu souboru:

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

Po několika hodinách strávených snahou o dosažení parity mezi formátem google-java a formatOnSave ve Visual Studio Code mám pocit, že jsem dosáhl dokonalého řešení.