Skip to content

Typed lowering IR

The lowering layer is the internal boundary between semantic analysis and code generation. It does not define or change Flecha source syntax.

Lowerer accepts a syntax tree, its SemanticModel, and the diagnostic bag produced by the frontend. Programs with frontend errors are rejected. Valid programs become a move-only BoundProgram where every expression has a resolved semantic type, every name refers directly to its symbol, and every node retains a half-open source range.

The bound program contains functions, blocks, local declarations, expression statements, returns, conditionals, literals, variable and function references, unary and binary operations, assignments, and direct calls. It holds non-owning references to symbols owned by the semantic model, so the syntax tree and semantic model must outlive the bound program.

Conditional syntax is normalized for backend consumption. else if becomes an if nested in the preceding alternative block. An also clause becomes a conditional appended to the successful body of its owning branch. This preserves the language rule that also is evaluated only after its owner ran.

DumpBoundProgram produces deterministic, human-readable text intended for debugging and tests. It is not Flecha syntax and is not a serialization format.

BoundDeferStatement retains a resolved direct call separately from immediate expression statements. Its arguments capture at registration, and codegen invokes the call during scope cleanup. See defer.md.

BoundTupleExpression retains ordered, typed elements. A BoundDestructureStatement holds one right-hand side and resolved destinations, including declaration/assignment flags and blank discards. It is not expanded into repeated evaluations of the source expression. See tuples.md.