Pular para o conteúdo

O analisador estático

Nomes, aridade, tipos, alcance, membros atravessando arquivos — e a regra de só falar quando consegue provar.

dataforge check roda o analisador sobre a árvore, sem executar nada. Ele pega o erro que num arquivo pequeno aparece na primeira execução — e que num sistema de duzentos arquivos aparece em produção.

PegaExemplo
nome não definido, com sugestãototl → "você quis dizer 'total'?"
aridadesomar(1) numa ação de dois parâmetros
tipo de parâmetro e de retornodobro("x") com n: Integer
membro que não existep.clientte num record — também atravessando adopt
código inalcançáveldepois de yield, ou point depois de uma captura
ciclo de importcom a cadeia inteira: a.df → b.df → a.df
escrita concorrenteuma rota escrevendo num nome de fora
?? que engole comparaçãov[k] ?? void is void

Otimista de propósito#

Quando não consegue provar que algo está errado, ele cala. Um falso alarme ensina a ignorar mensagens — e aí o alarme verdadeiro é ignorado junto. Por isso ele se cala sobre o membro de um blueprint que herda de algo não visto, sobre o tipo depois de uma ação decorada, e sobre a chave de um vault que alguém escreveu em outro lugar.

dataforge
adopt Arcane.Compilador as Comp

// o analisador vê o fluxo: 'y' só existe num dos caminhos
aviso := Comp.onde_talvez_nao_definidas("action f(x):\n    given x bigger 0:\n        y := 1\n    yield y\n")
out aviso