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:
- Detectar se o ficheiro é Java
- Executar
google-java-format -i ${file}
- 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.