Análise estática
O que o dataforge check encontra antes de executar, e por que ele é otimista.
Três etapas sem executar#
dataforge check meu_programa.df
dataforge check src/ --strict # avisos também falham
dataforge check x.df --syntax-only # só a sintaxe- Léxica — o arquivo é um DataForge válido?
- Sintática — a estrutura faz sentido?
- Semântica — os nomes existem? as chamadas batem? os tipos combinam?
O que ele encontra#
| Categoria | Exemplo | Mensagem |
|---|---|---|
| nome indefinido | sommar(1, 2) | Did you mean `somar`? |
| aridade | somar(1) | is missing argument(s): b |
| tipo de argumento | somar("x", 2) | expects Integer but got String |
| tipo de variável | x: Integer := "texto" | Declared as Integer but the value is String |
| tipo inexistente | x: Intger := 1 | Did you mean `Integer`? |
| constante reatribuída | LIMITE := 200 | Cannot reassign the steady constant |
| operador incompatível | 1 + [2] | Cannot add Integer and Cluster |
| campo de record | p.emial | Record has no field. Fields: nome, idade |
| membro de enum | Status.Cancelado | Members: Ativo, Inativo |
| código inalcançável | linha após yield | Unreachable code (aviso) |
| retorno ausente | -> Integer sem yield | can end without a yield (aviso) |
halt fora de laço | halt outside of a loop |
Um exemplo#
app.df:5:1: erro: Cannot reassign the steady constant 'LIMITE'
sugestão: Use another name, or drop 'steady' from the declaration
app.df:9:11: erro: Parameter 'a' of 'somar' expects Integer but got String
sugestão: Pass a Integer
app.df:10:5: erro: Undefined action 'sommar'
sugestão: Did you mean 'somar'?
✗ 3 erro(s), 0 aviso(s)Cada diagnóstico traz linha, coluna e sugestão. As sugestões de nome usam distância de edição — sommar → somar é encontrado automaticamente.
Por que é otimista#
O analisador fica calado quando não consegue provar que algo está errado. Isso é deliberado: DataForge é dinamicamente tipado, e um falso alarme atrapalha mais que um alerta perdido — porque ensina a ignorar as mensagens.
Calibragem atual: zero erros em 233 arquivos conhecidamente bons (os 190 exercícios mais os 42 exemplos).
O que ele não encontra#
divisor := 0
out 10 / divisor # o valor só é conhecido em tempo de execuçãoIsso passa no check e falha ao rodar. Erros que dependem de dados não são detectáveis estaticamente.
Erros dentro de monitor#
Código dentro de um monitor: existe justamente para conter falhas — provocar uma de propósito é legítimo. Por isso o analisador rebaixa erros a avisos ali dentro:
monitor:
x := 1 / 0 # aviso, não erro
handle e:
out e.messageEm integração contínua#
dataforge fmt . --check && dataforge check . && dataforge testCada comando sai com código diferente de zero em caso de falha. Com --strict, os avisos também derrubam o build.