ADRIANOLAUREANO← Artigos
SÉRIE TRAÇO · 03/03IDEMPOTÊNCIACI

Como garantir que um formatador seja estável e seguro para um projeto inteiro?

Uma ferramenta que muda o arquivo a cada execução, perde comentários ou produz diffs intermináveis não pode entrar no editor nem na CI. Como transformar layout em confiança?

ARTIGO 35 · TRAÇO 1.0 · SEGURANÇA E INTEGRAÇÃO

2provas por arquivo

4modos de uso

1escrita transacional

TRAÇO · ESTRUTURA, ALTERNATIVAS E PROVA
ENTRADAse(condição){
mostre(valor)//nota
}
TRAÇO 1.0preservar · compor · provar
SAÍDAse (condição) {
··mostre(valor) // nota
}

VOCABULÁRIO VISUAL

As decisões que tornam o resultado confiável.

01Determinismomesma entrada, mesma saída
02Equivalênciamesma estrutura semântica
03Goldensaída esperada versionada
04Rangeunidade sintática segura
05Checkverifica sem escrever
06LSPcontrato de formatação do editor
O Traço não “arruma espaços”: ele preserva estrutura, constrói opções de layout e prova a estabilidade da escolha.
01
Três propriedades diferentes sustentam a confiança.
Determinismo, idempotência e equivalência
determinismo: F(x) = sempre y
idempotência: F(F(x)) = F(x)
equivalência: parse_semântico(x) = parse_semântico(F(x))
Pouca diferença visual não prova nenhuma dessas propriedades.

Executar alguns programas antes e depois é verificação complementar: pode encontrar falhas, mas não prova equivalência para todas as entradas.

02
Todo o corpus passa duas vezes pelo Traço.
Goldens, propriedades e geração estruturada
let once = format(input, config)?;
let twice = format(&once, config)?;
assert_eq!(once, twice);
assert_eq!(semantic_ast(input), semantic_ast(&once));
assert_eq!(comments(input), comments(&once));

Um gerador cria árvores Pulso válidas, imprime variações deliberadamente feias e verifica as propriedades. Ele gera estrutura, não bytes aleatórios impossíveis de analisar.

03
Configuração demais destrói a linguagem comum.
Poucas escolhas, todas validadas
# traco.toml
max_width = 88
indent_width = 2
line_ending = "preserve"
final_newline = true

A busca sobe do arquivo até a raiz do workspace e para ali. Valores fora dos limites são erro; não existem combinações contraditórias. A opinião do Traço mantém diffs previsíveis.

04
Formatar um diretório não autoriza vasculhar tudo.
Raiz, ignore, extensão e symlinks

Antes de trabalhar, o Traço lista os .pulso considerados. Respeita .tracoignore, tamanho máximo e a raiz canônica; não segue symlink para fora. Arquivos inalterados não são regravados.

ler + guardar hash/permissões
→ formatar e validar
→ conferir que versão não mudou
→ temporário no mesmo filesystem + sync
→ preservar permissões + rename
→ limpar temporário em qualquer falha
check nunca entra na etapa de escrita.
05
Intervalos precisam crescer até uma unidade segura.
Range formatting sem cortar a árvore
seleção do usuário: parte de “a + b”
CST encontra ancestral seguro: declaração inteira
Traço formata declaração
retorna TextEdit somente para o intervalo expandido
Se não houver unidade recuperável, a ferramenta recusa em vez de adivinhar.

traco: off e traco: on preservam uma região literal, mas são validados em pares e não podem atravessar estrutura de modo inseguro.

06
Uma engine, quatro superfícies.
CLI, stdin, editor e CI
UsoComportamento
--checkexit 1 e diff, sem escrever
--writeescrita segura de arquivos
stdin/stdoutpipeline sem arquivo
LSPTextEdits para formatting/rangeFormatting

A Oficina envia versão do documento e só aplica a resposta se ela ainda for atual. Formatar ao salvar não mistura correções do Crivo.

07
Hook ajuda localmente; CI mantém a regra verificável.
Nenhuma modificação automática de repositório
# desenvolvedor escolhe instalar
traco check src/

# pipeline
traco check --config traco.toml .
# exit 0: tudo canônico
# exit 1: mostra arquivos e diff

O Traço documenta o hook, mas não o instala sozinho. Também não executa código do projeto durante formatação.

08
O percurso completo fecha o Traço 1.0.
Do arquivo desorganizado à gravação provada
fonte → tokens + trivia → CST + comentários
→ regras estruturais → documento de layout
→ Group + fits → texto final
→ AST equivalente + idempotência
→ diff → versão conferida → escrita segura
→ Oficina / CLI / CI recebem o mesmo resultado
Crivo diagnostica; Traço apresenta; compilador verifica; Oficina coordena; Git registra.

rustfmt, Prettier, gofmt e clang-format possuem gramáticas, políticas e escala diferentes. O Traço não cobre todas as construções, plugins ou compatibilidade industrial; ele torna o mecanismo completo observável.

Resposta final

Formatar é preservar estrutura e comentários, construir alternativas, escolher sob restrições e provar que o resultado é semanticamente equivalente e estável.

PROJETO COMPLETO · ESTADO EXATO DESTE CAPÍTULO

Baixe o Traço 1.0.

Pacote exclusivo com código Rust, corpus Pulso, testes e limites documentados. O modo check nunca modifica arquivos.

Baixar Traço 1.0 (.zip)Rust · Pulso · fixtures isoladas

O que este artigo fez você pensar?

Dúvidas, experiências e contrapontos ajudam a próxima pessoa a enxergar o assunto por outro ângulo.

Todos passam por moderação. Ao enviar, você concorda com a política de privacidade.

Receba os próximos artigos.

Uma mensagem quando uma nova investigação estiver pronta. Só isso.