ADRIANOLAUREANO← Artigos
SÉRIE TRAÇO · 01/03TRIVIACST

Como um formatador reorganiza código sem perder seu significado?

Dois arquivos podem parecer completamente diferentes e ainda representar o mesmo programa. Como escolher uma forma canônica sem apagar comentários, quebrar strings ou alterar operadores?

ARTIGO 33 · TRAÇO 0.1 · ESTRUTURA E COMENTÁRIOS

3representações comparadas

1árvore preservada

0comentários perdidos

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

VOCABULÁRIO VISUAL

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

01Triviaespaços, quebras e comentários
02ASTestrutura voltada ao significado
03CSTestrutura que preserva a forma
04Comentário líderaparece antes do nó
05Comentário finalpermanece na mesma linha
06Idempotênciaformatar de novo não muda nada
O Traço não “arruma espaços”: ele preserva estrutura, constrói opções de layout e prova a estabilidade da escolha.
01
Formatar não é substituir espaços.
O primeiro experimento quebra o programa
entrada: mostre("a  b") // dois espaços importam
regex:   mostre("a b") // conteúdo foi alterado

entrada: a - -b
regex:   a--b          // outro token, outro significado
Texto não revela sozinho onde espaço é estilo e onde é sintaxe ou dado.
FerramentaResponsabilidade
Estilo manualdecisões humanas locais
Crivodiagnósticos e correções específicas
Traçoapresentação canônica da estrutura inteira
Refatoraçãomudança intencional de estrutura semântica
02
A AST da Pulso esqueceu exatamente o que precisamos.
Executar e formatar pedem representações diferentes
fonte → lexer → tokens significativos → parser → AST → execução
             └─ espaços, quebras, comentários descartados

Traço: fonte → tokens + trivia + posições → estrutura preservada
Trivia não costuma mudar a gramática, mas é indispensável para reconstruir o arquivo.

Reaproveitamos lexer e parser da Pulso, porém o lexer agora emite trivia num canal preservado.

03
AST, CST ou uma árvore enriquecida?
Escolha guiada pelo que precisa sobreviver
RepresentaçãoConservaCusto
ASTsignificado essencialperde pontuação e trivia
CSTtodos os tokens e triviaárvore mais volumosa
AST enriquecidanós + tokens anexadosassociação complexa

O Traço usa uma CST compacta: folhas apontam para intervalos do texto original e nós representam construções. A AST semântica continua sendo produzida para a prova posterior.

04
Comentários precisam de endereço estrutural.
Antes, depois ou no fim da linha
// explica soma      → leading da declaração seguinte
função soma() {} // rápido → trailing de soma
a + /* unidade */ b → dangling no operador
// entre blocos      → preserva linha vazia e vizinhança
Distância, linha original e delimitadores ajudam; casos ambíguos mantêm posição conservadora.

Comentários não são reescritos. Strings também são folhas literais: o Traço organiza o entorno, nunca seu conteúdo.

05
Compreender e apresentar são fases separadas.
Nada de um match gigante concatenando strings
CST + comentários
  → FormatRules produz FormatElement
  → Renderer simples aplica espaços, quebras e indentação
  → texto + SourceMap de intervalos

Regras cobrem declarações, chamadas, operadores, funções, condicionais, laços e blocos. Neste capítulo, chamadas longas quebram sempre; o motor que escolhe alternativas virá depois.

06
Poucas regras formam um estilo reconhecível.
Espaços, chaves e linhas vazias
função soma(a,b){retorne a+b}
↓
função soma(a, b) {
  retorne a + b
}
Um espaço após vírgula; operadores cercados; bloco indentado; chaves previsíveis.

Linhas vazias consecutivas viram uma. Comentários de fim de linha permanecem ali; comentários isolados mantêm sua própria linha.

07
A CLI mostra antes de gravar.
format, check e diff
$ traco format exemplo.pulso
--- exemplo.pulso
+++ exemplo.pulso (Traço 0.1)
-função soma(a,b){retorne a+b}
+função soma(a, b) {
+  retorne a + b
+}

$ traco check exemplo.pulso
arquivo precisa de formatação · exit 1

Em check, nenhum byte muda. Em escrita, o Traço confere a versão lida, grava temporário no mesmo filesystem e substitui somente após sucesso.

08
Correção precisa de uma evidência estrutural.
Traço 0.1

Os testes verificam que tokens significativos e strings são idênticos, que todos os comentários reaparecem uma vez e que entrada e saída produzem ASTs semanticamente equivalentes para as construções suportadas.

Resposta do capítulo

O Traço reorganiza o arquivo porque sabe quais partes carregam significado, quais carregam apresentação e onde cada comentário pertence. Regex não possui esse mapa.

PROJETO COMPLETO · ESTADO EXATO DESTE CAPÍTULO

Baixe o Traço 0.1.

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

Baixar Traço 0.1 (.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.