13 pontos por beenzinozino 2024-11-14 | 2 comentários | Compartilhar no WhatsApp

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

 
rumbarum 2024-11-18

Apoio o desenvolvimento open source!

 
beenzinozino 2024-11-18

Obrigado!!🙇‍♂️