Usando o formato google-java com VS Code

Tenho feito algum desenvolvimento Java recentemente, e os meus editores preferidos de escolha saltam entre Visual Studio Code e Neovim. Minha configuração do vim está configurada para formatar arquivos fonte Java usando o formato google-java, mas eu estava lutando para conseguir o mesmo comportamento no Visual Studio Code. Este post explora como formatar arquivos fonte Java usando o formato google-java em VS Code.

TL;DR

Instalar emeraldwalk/vscode-runonsave:

$ code --install-extension emeraldwalk.RunOnSave

Instalar formato google-java para o seu sistema:

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

Configurar o RunOnSave nas configurações do Código do Visual Studio:

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

Fundo

Google publica um guia de estilo Google Java bem como o formato google-java que reformata o código Java de acordo com esse guia de estilo. O formatador está disponível como um Java JAR e através dos populares gerenciadores de pacotes. Por exemplo, para instalar o formatador no OS X:

$ brew install google-java-format

Então, para formatar arquivos fonte Java, passe-os como argumentos para o comando:

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

Trabalho existente

Já existem plugins populares para o formato google-java para IDEs como Eclipse e IntelliJ. Infelizmente, não existem plugins oficiais para o Visual Studio Code na altura em que este artigo foi escrito. Antes de criar minha própria solução, eu fiz algumas pesquisas na Internet.

A resposta mais popular vem do redhat-developer/vscode-java#419 que nos direciona para uma página Wiki com instruções para editar alguma configuração do 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",}

Esta instrução irá instruir o editor a usar o “GoogleStyle” ao formatar o código ao invés do estilo embutido. Isto pareceu um ótimo ajuste, já que eu já estou usando o suporte à linguagem Java da RedHat.

Embora isto mude o formato padrão do código, no meu teste ele não correspondeu à saída de execução google-java-format diretamente da linha de comando. Pior, ele modificou coisas como cabeçalhos de licenças, tornando-as inválidas.

Eu também tropecei no Dev-Snippets/vscode-google-java-format-provider, o que parecia promissor, mas não consegui fazer com que ele fosse registrado como formatador (e eu não sou o único).

Solução

Iniciei o caminho de escrever meu próprio plugin de Código do Visual Studio para rodar google-java-format como formatador. Após cerca de 10 minutos no exercício, percebi que este plugin ia ser bastante burro:

  1. Detectar se o ficheiro é Java
  2. Executar google-java-format -i ${file}
  3. Relatar quaisquer erros de volta ao utilizador

Essas etapas são essencialmente “correr um comando ao gravar”, e acontece que alguém já escreveu uma extensão! emeraldwalk/vscode-runonsave lê as configurações do Visual Studio Code, faz a correspondência de arquivos em uma expressão regular, e então executa um comando fornecido pelo usuário. Esta provou ser uma solução mínima mas perfeita!

Eu instalei RunOnSave e google-java-format no meu Mac:

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

Então configurei RunOnSave para executar google-java-format em arquivos que terminam em .java nas configurações do Visual Studio Code:

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

Isso requer que google-java-format esteja no meu $PATH. Se não fosse, eu poderia especificar o caminho completo para o binário:

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

Depois de passar algumas horas tentando alcançar a paridade entre o formato google-java e o código do Visual Studio formatOnSave, sinto que cheguei a uma solução perfeita.