MCPcopy Create free account
hub / github.com/argumentcomputer/ix / ground_expr

Function ground_expr

crates/compile/src/ground.rs:150–203  ·  view source on GitHub ↗
(
  expr: &Expr,
  env: &Env,
  univs: &[Name],
  binds: usize,
  stt: &mut GroundState,
)

Source from the content-addressed store, hash-verified

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
166fn 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)?;

Callers 1

ground_constFunction · 0.85

Calls 6

ground_levelFunction · 0.85
as_dataMethod · 0.80
cloneMethod · 0.45
containsMethod · 0.45
insertMethod · 0.45
contains_keyMethod · 0.45

Tested by

no test coverage detected