pub enum PassReport {
Show 14 variants
Tco {
tail_calls_added: usize,
fns_changed: Vec<FnCountChange>,
non_tail_recursive: Vec<NonTailEntry>,
},
Typecheck {
items_checked: usize,
errors: usize,
error_messages: Vec<String>,
},
InterpLower {
interpolations_lowered: usize,
fns_changed: Vec<FnCountChange>,
},
BufferBuild(BufferBuildPassReport),
Resolve {
slots_resolved: usize,
fns_with_slots: usize,
slot_types_total: usize,
slot_types_invalid: usize,
},
LastUse {
last_use_marked: usize,
total_resolved: usize,
},
Analyze {
total_fns: usize,
no_alloc_fns: usize,
recursive_fns: usize,
mutual_tco_members: usize,
unknown_alloc: usize,
},
Escape {
rewrites: usize,
},
RefinementLower {
refined_types: usize,
},
IntervalAnalyze {
types_analyzed: usize,
two_sided_bounded: usize,
ops_overflow_free: usize,
ops_needs_wider: usize,
ops_unbounded: usize,
raw_i64_eligible: usize,
},
ContractLower {
fn_contracts: usize,
},
LawLower {
law_theorems: usize,
},
BuildSymbols {
fns: usize,
types: usize,
ctors: usize,
modules: Vec<BuildSymbolsModule>,
fn_name_collisions: usize,
type_name_collisions: usize,
},
NameResolve {
promoted_fns: usize,
passthrough_items: usize,
unresolved_count: usize,
},
}Expand description
Typed per-pass report. Each variant carries the structured facts a
CI gate cares about — counts, fn names, error messages — so scripts
don’t have to regex-parse human-readable summaries. The text and
JSON renderers in cmd_explain_passes derive their output from
these values.
Variants§
Tco
Fields
fns_changed: Vec<FnCountChange>Per-fn before/after, alphabetised by name.
non_tail_recursive: Vec<NonTailEntry>Recursive callsites that did NOT convert (still call the fn in non-tail position). Empty when the pass was clean.
Typecheck
Fields
InterpLower
Fields
fns_changed: Vec<FnCountChange>Per-fn before/after counts for fns whose interpolation count dropped during the pass.
BufferBuild(BufferBuildPassReport)
Resolve
Fields
LastUse
Analyze
Fields
Escape
Fields
RefinementLower
Fields
IntervalAnalyze
Fields
two_sided_bounded: usizeOf those, how many yielded a two-sided constant interval (both bounds finite) — the carrier-lowering candidates.
ContractLower
Fields
LawLower
Fields
BuildSymbols
Fields
modules: Vec<BuildSymbolsModule>Per-module breakdown (entry first, then deps in walk order). Shows where each fn/type lives — useful for “is this big project actually multi-module?” sanity checks at a glance.
fn_name_collisions: usizeNumber of bare fn names that occur in 2+ different
scopes (e.g. entry + Module, or Module.A + Module.B).
Under bare-name keying these would have silently
merged; opaque FnId keeps them distinct. Zero would
mean phase E migration had no practical effect on
this project — non-zero is the proof it did.
NameResolve
Fields
promoted_fns: usizeTop-level fn definitions promoted to
crate::ir::hir::ResolvedFnDef. One per FnDef that
resolved through the symbol table.
passthrough_items: usizeTop-level items kept as
crate::ir::hir::ResolvedTopLevel::Passthrough (verify
blocks, decisions, type defs, top-level stmts, and any
fn whose name didn’t resolve — typechecker error
recovery). The fewer of these, the more the resolved
HIR captured.
unresolved_count: usizeResolver-escape-hatch occurrences in the resolved tree —
ResolvedCallee::Unresolved and ResolvedCtor::Unresolved
summed across every expression. The contract for backends
that consume resolved_items is zero unresolved for
well-typed programs; non-zero implies either a
typechecker error already reported (the resolver bailed
to recovery shape) or a resolver gap that needs
patching. CI gates can compare this count against the
typecheck error count to catch silent resolver
regressions.
Trait Implementations§
Source§impl Clone for PassReport
impl Clone for PassReport
Source§fn clone(&self) -> PassReport
fn clone(&self) -> PassReport
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more