Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Judgment codegen_expr_into at crates/formality-rust/src/codegen/mod.rs:221

Signature:

codegen_expr_into(global: CodegenGlobal, cfn: CodegenFn, scope: CodegenScope, target: MiniRustLocal, expr: Expr,) => (CodeBlock, CodegenGlobal, CodegenFn)

The number on each rule’s conclusion is positive coverage; the number on each premise is negative coverage. Click a number to browse the tests.

literal
LineCoverageSource
232N/A(let code = cfn.fresh_code_block())
──────── ("literal")
234(codegen_expr_into(global, cfn, scope, target, Expr::Literal { value, ty }) => (
code.assign(target, constant(value, ty)),
global,
cfn,
))
fn-as-value
LineCoverageSource
243(if scope.lookup_var(id).is_err())
244(if cfn.crates.fn_named(id).is_ok())
245N/A(let code = cfn.fresh_code_block())
──────── ("fn-as-value")
247(codegen_expr_into(global, cfn, scope, target, Expr::Place(PlaceExpr::Var(id))) => (
code.assign(target, unit_value()),
global,
cfn,
))
place
LineCoverageSource
255(resolve_place(cfn, scope, place_expr) => typed)
256(let source = typed_place_to_minirust(cfn, scope, &typed)?)
257N/A(let code = cfn.fresh_code_block())
──────── ("place")
259(codegen_expr_into(global, cfn, scope, target, Expr::Place(place_expr)) => (
code.assign(target, load(source)),
global,
cfn,
))
true
LineCoverageSource
267N/A(let code = cfn.fresh_code_block())
──────── ("true")
269(codegen_expr_into(global, cfn, scope, target, Expr::True) => (
code.assign(target, bool_constant(true)),
global,
cfn,
))
false
LineCoverageSource
277N/A(let code = cfn.fresh_code_block())
──────── ("false")
279(codegen_expr_into(global, cfn, scope, target, Expr::False) => (
code.assign(target, bool_constant(false)),
global,
cfn,
))
assign
LineCoverageSource
287(resolve_place(cfn, scope, place) => typed_dest)
288(let dest = typed_place_to_minirust(cfn, scope, &typed_dest)?)
289(type_expr(cfn, scope, rhs) => rhs_ty)
290(let (rhs_temp, cfn) = cfn.alloc_temp(rhs_ty)?)
291(codegen_expr_into(global, cfn, scope, rhs_temp, rhs) => (code, global, cfn))
──────── ("assign")
293(codegen_expr_into(global, cfn, scope, target, Expr::Assign { place, expr: rhs }) => (
code
.assign(dest, load(rhs_temp))
.assign(target, unit_value()),
global,
cfn,
))
turbofish
LineCoverageSource
305N/A(let code = cfn.fresh_code_block())
──────── ("turbofish")
307(codegen_expr_into(global, cfn, scope, target, Expr::Turbofish { .. }) => (
code.assign(target, unit_value()),
global,
cfn,
))
call
LineCoverageSource
318(type_expr(cfn, scope, callee) => callee_ty)
319(resolve_rigid(cfn, scope, callee_ty) => RigidTy { name: RigidName::FnDef(fn_id), parameters })
320N/A(let (fn_name, global) = global.ensure_fn(MonoKey::new(fn_id, parameters)))
322(let (callee_temp, cfn) = cfn.alloc_temp(&callee_ty)?)
323(codegen_expr_into(global, cfn, scope, callee_temp, callee) => (code, global, cfn))
325(let (temps, cfn) = alloc_temps_for_args(cfn, scope, args)?)
326(for_all(i in 0..args.len()) with(code, global, cfn)
(codegen_expr_into(global, cfn, scope, &temps[i], &args[i]) => (arg_code, global, cfn))
(let (code, cfn) = cfn.append_from(code, arg_code)))
330(let (code, cfn) = cfn.call(code, fn_name, temps, target)?)
──────── ("call")
332(codegen_expr_into(global, cfn, scope, target, Expr::Call { callee, args }) => (code, global, cfn))
ref
LineCoverageSource
336(resolve_place(cfn, scope, place) => typed)
337(let mr_place = typed_place_to_minirust(cfn, scope, typed)?)
338(let ref_value = addr_of(cfn, mr_place, kind, &typed.ty)?)
339N/A(let code = cfn.fresh_code_block())
──────── ("ref")
341(codegen_expr_into(global, cfn, scope, target, Expr::Ref { kind, lt: _, place }) => (
code.assign(target, ref_value),
global,
cfn,
))
struct
LineCoverageSource
349(let fields = resolve_struct_fields(cfn, adt_id, turbofish)?)
350(let (temps, cfn) = alloc_temps_for_fields(cfn, fields)?)
351N/A(let code = cfn.fresh_code_block())
352(for_all(i in 0..fields.len()) with(code, global, cfn)
(let field_expr = find_field_expr(field_exprs, &fields[i])?)
(codegen_expr_into(global, cfn, scope, &temps[i], field_expr) => (field_code, global, cfn))
(let (code, cfn) = cfn.append_from(code, field_code)))
356(let struct_value = tuple_value(&temps, adt_id, turbofish, &cfn.crates)?)
──────── ("struct")
358(codegen_expr_into(global, cfn, scope, target, Expr::Struct { field_exprs, adt_id, turbofish }) => (
code.assign(target, struct_value),
global,
cfn,
))