English {#english}
Audit Deep Dive: Parser, AST, Semantic
Mintlify docs tour — after Lucas's backend audit, Bruno's front-end audit completes the compiler pipeline picture.
Lucas mapped run/build divergence. Bruno audited parser, AST, spans, and semantic validation — the phases that decide whether Delphi source becomes a trustworthy program tree. Full report: Audit (Bruno) — Parser.
Audit scope
Files examined:
-
src/parser/mod.rs— Delphi syntax surface -
src/ast/*— program representation -
src/semantic/mod.rs— type checking and diagnostics - Cross-check against Sprint 1–8 review docs (read-only)
Goal: find where real Delphi code would parse incorrectly or lose AST information silently.
TD-PARSER-001: multiple fields per declaration
Evidence: parse_field_declaration (~2442–2456) — for A, B: Integer, only names[0] enters the AST; comment says // TODO: Handle multiple fields.
Impact: Common class/record declarations lose fields. Runtime may appear to work until missing fields cause subtle bugs.
Fix: Sprint 11 (v2.19.0) — closed per backlog.
Test: fixture record Test; A,B: Integer; end. passes check.
TD-PARSER-002: implemented interfaces
Evidence: parse_class_definition — interfaces: Vec::new(), // TODO - parsear interfaces implementadas.
Impact: class(TBase, I1, I2) not represented; dispatch and semantic checks cannot enforce interface contracts.
Fix: Sprint 11 — interfaces populated in AST.
TD-PARSER-004: explicit out parameters
Evidence: parse_parameters (~858–871) accepts var and const but no Token::Out branch.
Impact: Modern Delphi signatures like procedure P(out N: Integer) fail or parse wrong.
Fix: Sprint 11 — out token treated as var for compatibility.
TD-PARSER-003: generic parameters on classes (still open)
Evidence: generic_parameters: Vec::new(), // TODO in class parsing.
Impact: type TFoo<T> = class unavailable in AST for instantiation.
Target: Sprint 15 (v2.23.0) or earlier partial support.
TD-PARSER-005: published section (P2)
Evidence: comment // Published não tem token, skip in class parsing.
Impact: RTTI/serialization scenarios lose visibility metadata. Lower priority than field/interface gaps.
TD-SEMANTIC-001: broken test baseline
Evidence: test_undefined_variable in src/semantic/mod.rs (~1370–1381) expected "Undefined variable" but cargo test failed the assert.
Impact: CI not trustworthy for semantic changes.
Fix: Sprint 9 (v2.17.0) — message alignment and green baseline.
Panic safety note
Audit found panic!/unwrap() mainly in #[cfg(test)] blocks — parser tests and AST unit tests — not in production parse paths. TD-PARSER-008 tracks continuous vigilance: zero panics on user syntax errors; return Result with spans instead.
What already worked (S6/S7)
Positive findings matter too:
-
propertyparsing withread/writeidentifiers —parse_property_declaration(~1574–1629) - Visibility sections:
private/public/protectedwith defaultpublic - Generic expressions like
TDictionary<String,Integer>— Sprint 7
The front-end is not uniformly broken — gaps are specific Delphi surface features common in enterprise codebases.
Recommended tests from audit
| Test ID | Fixture | Validates |
|---|---|---|
| TST-PARSER-MULTI-FIELDS-001 | A,B: Integer |
TD-PARSER-001 |
| TST-PARSER-OUT-001 | procedure P(out N: Integer) |
TD-PARSER-004 |
| TST-PARSER-INTERFACES-001 | class(TBase, I1, I2) |
TD-PARSER-002 |
Run after changes:
cargo test --lib parser
crab-pascal check tests/fixtures/your_new_fixture.pas
Contributor path
Parser fixes are ideal good first sprint work: isolated, test-driven, visible in check output. Reference Bruno's audit ID in PRs; update backlog status when merged.
Next in series (052): Helena's RTL/Unicode/properties audit — the runtime layer Delphi developers feel every day.
Português {#portugus}
Auditoria: parser, AST, semântica
Tour Mintlify — depois da auditoria backend de Lucas, a auditoria front-end de Bruno completa o quadro do pipeline do compilador.
Lucas mapeou divergência run/build. Bruno auditou parser, AST, spans e validação semântica — fases que decidem se fonte Delphi vira árvore de programa confiável. Relatório completo: Auditoria (Bruno) — Parser.
Escopo da auditoria
Arquivos examinados:
-
src/parser/mod.rs— superfície sintática Delphi -
src/ast/*— representação do programa -
src/semantic/mod.rs— type checking e diagnósticos - Cross-check com docs de review Sprints 1–8 (somente leitura)
Objetivo: achar onde código Delphi real parsearia incorretamente ou perderia informação na AST silenciosamente.
TD-PARSER-001: múltiplos fields por declaração
Evidência: parse_field_declaration (~2442–2456) — para A, B: Integer, só names[0] entra na AST; comentário // TODO: Handle multiple fields.
Impacto: Declarações comuns de class/record perdem fields. Runtime pode parecer OK até fields faltantes causarem bugs sutis.
Fix: Sprint 11 (v2.19.0) — fechado no backlog.
Teste: fixture record Test; A,B: Integer; end. passa no check.
TD-PARSER-002: interfaces implementadas
Evidência: parse_class_definition — interfaces: Vec::new(), // TODO - parsear interfaces implementadas.
Impacto: class(TBase, I1, I2) não representado; dispatch e checks semânticos não impõem contratos de interface.
Fix: Sprint 11 — interfaces populadas na AST.
TD-PARSER-004: parâmetros out explícitos
Evidência: parse_parameters (~858–871) aceita var e const mas sem branch Token::Out.
Impacto: Assinaturas Delphi modernas como procedure P(out N: Integer) falham ou parseiam errado.
Fix: Sprint 11 — token out tratado como var para compatibilidade.
TD-PARSER-003: parâmetros genéricos em classes (ainda aberto)
Evidência: generic_parameters: Vec::new(), // TODO no parse de class.
Impacto: type TFoo<T> = class indisponível na AST para instanciação.
Alvo: Sprint 15 (v2.23.0) ou suporte parcial antes.
TD-PARSER-005: seção published (P2)
Evidência: comentário // Published não tem token, skip no parse de class.
Impacto: Cenários RTTI/serialização perdem metadado de visibilidade. Prioridade menor que gaps de field/interface.
TD-SEMANTIC-001: baseline de testes quebrada
Evidência: test_undefined_variable em src/semantic/mod.rs (~1370–1381) esperava "Undefined variable" mas cargo test falhou no assert.
Impacto: CI não confiável para mudanças semânticas.
Fix: Sprint 9 (v2.17.0) — alinhamento de mensagem e baseline verde.
Nota sobre segurança de panic
Auditoria encontrou panic!/unwrap() principalmente em blocos #[cfg(test)] — testes do parser e unitários de AST — não em paths de parse de produção. TD-PARSER-008 rastreia vigilância contínua: zero panics em erros de sintaxe do usuário; retornar Result com spans.
O que já funcionava (S6/S7)
Achados positivos também importam:
- Parse de
propertycom identificadoresread/write—parse_property_declaration(~1574–1629) - Seções de visibilidade:
private/public/protectedcom defaultpublic -
Expressões genéricas como
TDictionary<String,Integer>— Sprint 7
O front-end não está uniformemente quebrado — gaps são features específicas de superfície Delphi comuns em codebases enterprise.
Testes recomendados da auditoria
| ID teste | Fixture | Valida |
|---|---|---|
| TST-PARSER-MULTI-FIELDS-001 | A,B: Integer |
TD-PARSER-001 |
| TST-PARSER-OUT-001 | procedure P(out N: Integer) |
TD-PARSER-004 |
| TST-PARSER-INTERFACES-001 | class(TBase, I1, I2) |
TD-PARSER-002 |
Rode após mudanças:
cargo test --lib parser
crab-pascal check tests/fixtures/your_new_fixture.pas
Caminho do contribuidor
Fixes de parser são trabalho ideal de good first sprint: isolados, test-driven, visíveis no output do check. Referencie ID da auditoria de Bruno em PRs; atualize status no backlog ao mergear.
Próximo na série (052): auditoria RTL/Unicode/properties de Helena — camada de runtime que desenvolvedores Delphi sentem todo dia.
Published on dev.to/@crabpascal · Código em CrabPascal
Top comments (0)