( exprs: &[(&LeanExpr, &[Name])], mut_ctx: &MutCtx, cache: &mut BlockCache, stt: &CompileState, caller: &str, )
| 543 | } |
| 544 | |
| 545 | fn univ_params_key(univ_params: &[Name]) -> Address { |
| 546 | let mut hasher = blake3::Hasher::new(); |
| 547 | for name in univ_params { |
| 548 | hasher.update(name.get_hash().as_bytes()); |
| 549 | } |
| 550 | Address::from_blake3_hash(hasher.finalize()) |
| 551 | } |
| 552 | |
| 553 | fn collect_expr_tables( |
| 554 | expr: &LeanExpr, |
| 555 | univ_params: &[Name], |
| 556 | mut_ctx: &MutCtx, |
| 557 | cache: &mut BlockCache, |
| 558 | stt: &CompileState, |
| 559 | refs: &mut Vec<Address>, |
| 560 | univs: &mut Vec<Arc<Univ>>, |
| 561 | seen_exprs: &mut FxHashMap<(Address, Address), ()>, |
| 562 | caller: &str, |
| 563 | ) -> Result<(), CompileError> { |
| 564 | let ctx_key = univ_params_key(univ_params); |
| 565 | let mut stack = vec![expr]; |
| 566 | while let Some(e) = stack.pop() { |
| 567 | let key = Address::from_blake3_hash(*e.get_hash()); |
| 568 | if seen_exprs.insert((key, ctx_key.clone()), ()).is_some() { |
| 569 | continue; |
| 570 | } |
| 571 | |
| 572 | match e.as_data() { |
| 573 | ExprData::Bvar(..) => {}, |
| 574 | ExprData::Sort(level, _) => { |
| 575 | univs.push(compile_univ(level, univ_params, cache)?); |
| 576 | }, |
| 577 | ExprData::Const(name, levels, _) => { |
| 578 | for level in levels { |
| 579 | univs.push(compile_univ(level, univ_params, cache)?); |
| 580 | } |
| 581 | if !mut_ctx.contains_key(name) { |
| 582 | let const_addr = stt.resolve_addr(name).ok_or_else(|| { |
| 583 | CompileError::MissingConstant { |
| 584 | name: name.pretty(), |
| 585 | caller: format!("{caller} @ preseed(Const)"), |
| 586 | } |
| 587 | })?; |
| 588 | refs.push(const_addr); |
no test coverage detected