( expr: &Expr, env: &Env, univs: &[Name], binds: usize, stt: &mut GroundState, )
| 148 | return Err(GroundError::Indc(Box::new((val.clone(), ci)))); |
| 149 | }, |
| 150 | } |
| 151 | } |
| 152 | ground_expr(&val.cnst.typ, env, univs, binds, stt) |
| 153 | }, |
| 154 | ConstantInfo::CtorInfo(val) => { |
| 155 | ground_expr(&val.cnst.typ, env, univs, binds, stt) |
| 156 | }, |
| 157 | ConstantInfo::RecInfo(val) => { |
| 158 | for rule in &val.rules { |
| 159 | ground_expr(&rule.rhs, env, univs, binds, stt)?; |
| 160 | } |
| 161 | ground_expr(&val.cnst.typ, env, univs, binds, stt) |
| 162 | }, |
| 163 | } |
| 164 | } |
| 165 | |
| 166 | fn ground_expr( |
| 167 | expr: &Expr, |
| 168 | env: &Env, |
| 169 | univs: &[Name], |
| 170 | binds: usize, |
| 171 | stt: &mut GroundState, |
| 172 | ) -> Result<(), GroundError> { |
| 173 | let key = (binds, expr.clone()); |
| 174 | if stt.expr_cache.contains(&key) { |
| 175 | return Ok(()); |
| 176 | } |
| 177 | stt.expr_cache.insert(key); |
| 178 | match expr.as_data() { |
| 179 | ExprData::Mdata(_, e, _) => ground_expr(e, env, univs, binds, stt), |
| 180 | ExprData::Bvar(idx, _) => { |
| 181 | if *idx >= Nat(binds.into()) { |
| 182 | return Err(GroundError::Var(expr.clone(), binds)); |
| 183 | } |
| 184 | Ok(()) |
| 185 | }, |
| 186 | ExprData::Sort(level, _) => ground_level(level, univs, stt), |
| 187 | ExprData::Const(name, levels, _) => { |
| 188 | for level in levels { |
| 189 | ground_level(level, univs, stt)?; |
| 190 | } |
| 191 | if !env.contains_key(name) { |
| 192 | return Err(GroundError::Ref(name.clone())); |
| 193 | } |
| 194 | Ok(()) |
| 195 | }, |
| 196 | ExprData::App(f, a, _) => { |
| 197 | ground_expr(f, env, univs, binds, stt)?; |
| 198 | ground_expr(a, env, univs, binds, stt) |
| 199 | }, |
| 200 | ExprData::Lam(_, t, b, ..) | ExprData::ForallE(_, t, b, ..) => { |
| 201 | ground_expr(t, env, univs, binds, stt)?; |
| 202 | ground_expr(b, env, univs, binds + 1, stt) |
| 203 | }, |
| 204 | ExprData::LetE(_, t, v, b, ..) => { |
| 205 | ground_expr(t, env, univs, binds, stt)?; |
| 206 | ground_expr(v, env, univs, binds, stt)?; |
no test coverage detected