Desenvolvi um formatador de C, C++ e Java com Clang para o ambiente Node.js
(github.com/lumirlumir)Olá, desenvolvi um formatador de C, C++ e Java com Clang para o ambiente Node.js. Este projeto é uma nova iniciativa baseada no pacote angular clang-format, que já não recebe manutenção (foi descontinuado).
Eu já havia publicado sobre isso há cerca de dois meses, mas como a estabilidade do pacote melhorou bastante e novos recursos foram adicionados, resolvi escrever novamente.
Atualmente, graças ao interesse de muitas pessoas e à migração de vários usuários legados, o número de downloads semanais ultrapassou 10.000. Muito obrigado.
Além disso, o pacote alcançou cobertura total de testes e, como já existe um PR no Node.js Core para substituir o projeto angular clang-format por este pacote, acredito que vocês podem usá-lo com confiança em termos de estabilidade. (Claro, ainda pode haver pontos que eu tenha deixado passar...)
Este pacote é baseado no clang-format do Clang, famoso compilador C da LLVM, e serve para formatar código nas linguagens C, C++ e Java. Dá para pensar nele como cumprindo o mesmo papel do Prettier, um dos pacotes mais conhecidos no ambiente Node.js.
No entanto, como o Prettier não oferece suporte à formatação de C, C++ e Java, muitas vezes recorre-se ao clang-format para padronizar o código nessas linguagens.
O clang-format no ambiente Node.js é especialmente útil quando é preciso escrever código JavaScript junto com código C/C++, como no desenvolvimento do Node.js Core. No caso do clang-format tradicional, era necessário instalar dependências adicionais para usar o pacote, mas com o pacote atual isso não é mais necessário.
Além disso, o pacote clang-format anterior tinha aspectos bastante complicados para integração em workflows com Node.js e npm, como em CI. Já com o pacote atual, basta baixá-lo pelo npm e configurar os scripts, o que traz muitas vantagens em ambientes de CI.
Além disso, com a atualização para a versão 1.2.0, novos recursos foram adicionados. A principal mudança foi a inclusão do pacote git-clang-format.
Vamos usar como exemplo uma situação em que, ao tocar um projeto em C/C++, você percebe a necessidade de formatação de código e decide adotar pacotes como o clang-format.
Em projetos pequenos, pode não haver grande problema em refatorar toda a formatação do código de uma vez e fazer um commit único, sem comprometer muito o rastreamento do histórico. Porém, em projetos grandes, a introdução da formatação pode exigir uma reformatação em massa do código existente, o que traz o risco de deixar o histórico de commits confuso.
Nesse caso, imagine que o desenvolvedor alterou apenas 100 linhas em um total de 1.000. O que aconteceria se, no momento do commit, a verificação de formatação fosse feita apenas nessas 100 linhas modificadas? Primeiro, como a formatação seria aplicada só ao trecho alterado, não seria necessário mexer nas 1.000 linhas inteiras, tornando o histórico de commits mais fácil de acompanhar. Segundo, à medida que o código continua sendo commitado durante o desenvolvimento, cada vez mais trechos passam a obedecer à formatação, e com o tempo a consistência do estilo do código aumenta naturalmente.
É para isso que serve o pacote git-clang-format. Assim como o lint-staged melhora a velocidade do CI ao verificar apenas arquivos em staged, ele vai um passo além: entre os arquivos alterados, é possível aplicar a verificação de formatação apenas às linhas efetivamente modificadas. Como esse recurso também é fornecido por padrão pela LLVM, eu o empacotei e publiquei dessa forma.
Deixei o modo de uso detalhado na documentação oficial, então agradeço muito o interesse de vocês. (Mas a documentação oficial está em inglês...) Se tiverem dúvidas ou outras opiniões, ficarei grato se deixarem um comentário. Obrigado por lerem este texto longo.
Documentação oficial: https://clang-format-node.lumir.page
Repositório: https://github.com/lumirlumir/npm-clang-format-node
2 comentários
Apoio o desenvolvimento open source!
Obrigado!!🙇♂️