Utiliser google-java-format avec VS Code

J’ai fait un peu de développement Java récemment, et mes éditeurs de choix rebondissent entre Visual Studio Code et Neovim. Ma configuration vim est configurée pour formater les fichiers source Java en utilisant google-java-format, mais je luttais pour obtenir le même comportement dans Visual Studio Code. Ce post explore comment formater les fichiers source Java en utilisant google-java-format dans VS Code.

TL;DR

Installer emeraldwalk/vscode-runonsave:

$ code --install-extension emeraldwalk.RunOnSave

Installer google-java-format pour votre système:

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

Configurer RunOnSave dans les paramètres de Visual Studio Code :

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

Background

Google publie un guide de style Google Java verbeux ainsi que google-java-format qui reformate le code Java selon ce guide de style. Le formateur est disponible en tant que JAR Java et via les gestionnaires de paquets populaires. Par exemple, pour installer le formateur sur OS X:

$ brew install google-java-format

Puis, pour formater les fichiers sources Java, passez-les comme arguments à la commande:

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

Travaux existants

Il existe déjà des plugins populaires pour google-java-format pour des IDE comme Eclipse et IntelliJ. Malheureusement, il n’en existe pas d’officiels pour Visual Studio Code au moment de la rédaction de cet article. Avant de trouver ma propre solution, j’ai fait quelques recherches sur Internet.

La réponse la plus populaire vient de redhat-developer/vscode-java#419 qui nous dirige vers une page Wiki avec des instructions pour modifier une certaine configuration de 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",}

Ceci indiquera à l’éditeur d’utiliser le « GoogleStyle » lors du formatage du code au lieu du style intégré. Cela semblait bien adapté, puisque j’utilise déjà le support du langage Java de RedHat.

Bien que cela change le format par défaut du code, dans mes tests, il ne correspondait pas à la sortie de l’exécution de google-java-format directement à partir de la ligne de commande. Pire, il modifiait des choses comme les en-têtes de licence, les rendant invalides.

Je suis également tombé sur Dev-Snippets/vscode-google-java-format-provider, qui semblait prometteur, mais je n’ai pas réussi à le faire enregistrer comme formateur (et je ne suis pas le seul).

Solution

J’ai commencé sur la voie de l’écriture de mon propre plugin Visual Studio Code pour exécuter google-java-format comme formateur. Après environ 10 minutes dans l’exercice, j’ai réalisé que ce plugin allait être assez bête :

  1. Détecter si le fichier est Java
  2. Exécuter google-java-format -i ${file}
  3. Rapport des erreurs éventuelles à l’utilisateur

Ces étapes sont essentiellement « exécuter une commande à la sauvegarde », et il s’avère que quelqu’un a déjà écrit une extension ! emeraldwalk/vscode-runonsave lit les paramètres de Visual Studio Code, fait correspondre les fichiers sur une expression régulière, puis exécute une commande fournie par l’utilisateur. Cela s’est avéré être une solution minimale mais parfaite!

J’ai installé RunOnSave et google-java-format sur mon Mac:

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

Puis j’ai configuré RunOnSave pour exécuter google-java-format sur les fichiers qui se terminent par .java dans les paramètres de Visual Studio Code:

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

Cela nécessite que google-java-format soit dans mon $PATH. Si ce n’était pas le cas, je pouvais spécifier le chemin complet du binaire à la place:

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

Après avoir passé quelques heures à essayer d’atteindre la parité entre le google-java-format et le formatOnSave de Visual Studio Code, j’ai l’impression d’avoir atteint une solution parfaite.