diff --git a/kernel/src/type_checker.rs b/kernel/src/type_checker.rs index 1c8477c18682a874ee37193157b3148a032cdb28..4d3169c122ad497603ab9a569a837d2df82d9483 100644 --- a/kernel/src/type_checker.rs +++ b/kernel/src/type_checker.rs @@ -96,8 +96,8 @@ impl<'arena> Term<'arena> { Ok(Term::sort(lvl, arena)) }, - (&Sort(_), _) => Err(Error::new(TypeCheckerError::NotUniverse(rhs).into())), - (_, _) => Err(Error::new(TypeCheckerError::NotUniverse(self).into())), + (&Sort(_), _) => Err(Error::new(TypeCheckerError::NotUniverse(rhs).into())).trace_err(Trace::Right), + (_, _) => Err(Error::new(TypeCheckerError::NotUniverse(self).into())).trace_err(Trace::Left), } } @@ -131,12 +131,12 @@ impl<'arena> Term<'arena> { }, App(t, u) => { - let type_t = t.infer(arena)?; + let type_t = t.infer(arena).trace_err(Trace::Left)?; let type_t = type_t.whnf(arena); match *type_t { Prod(arg_type, cls) => { - let type_u = u.infer(arena)?; + let type_u = u.infer(arena).trace_err(Trace::Right)?; if type_u.conversion(arg_type, arena) { Ok(cls.substitute(u, 1, arena)) @@ -145,7 +145,7 @@ impl<'arena> Term<'arena> { } }, - _ => Err(Error::new(TypeCheckerError::NotAFunction(TypedTerm(t, type_t), u).into())), + _ => Err(Error::new(TypeCheckerError::NotAFunction(TypedTerm(t, type_t), u).into())).trace_err(Trace::Left), } }, @@ -276,7 +276,8 @@ mod tests { assert_eq!( term_lhs.is_def_eq(term_rhs, arena), Err(Error { - kind: TypeCheckerError::NotDefEq(term_lhs, term_rhs).into() + kind: TypeCheckerError::NotDefEq(term_lhs, term_rhs).into(), + trace: vec![] }) ); }); @@ -291,7 +292,8 @@ mod tests { assert_eq!( term_lhs.is_def_eq(term_rhs, arena), Err(Error { - kind: TypeCheckerError::NotDefEq(term_lhs, term_rhs).into() + kind: TypeCheckerError::NotDefEq(term_lhs, term_rhs).into(), + trace: vec![] }) ); }); @@ -306,7 +308,8 @@ mod tests { assert_eq!( term_lhs.is_def_eq(term_rhs, arena), Err(Error { - kind: TypeCheckerError::NotDefEq(term_lhs, term_rhs).into() + kind: TypeCheckerError::NotDefEq(term_lhs, term_rhs).into(), + trace: vec![] }) ); }); @@ -567,6 +570,7 @@ mod tests { Term::prop(arena) ) .into() + trace: vec![Trace::Left, Trace::Left] }) ); }); @@ -585,6 +589,7 @@ mod tests { Term::prop(arena) ) .into() + trace: vec![Trace::Left, Trace::Right] }) ); }); @@ -603,6 +608,7 @@ mod tests { Term::prop(arena) ) .into() + trace: vec![Trace::Left, Trace::Left] }) ); }); @@ -621,6 +627,7 @@ mod tests { Term::prop(arena) ) .into() + trace: vec![Trace::Left] }) ); }); @@ -639,6 +646,7 @@ mod tests { Term::prop(arena) ) .into() + trace: vec![Trace::Left, Trace::Left] }) ); }); @@ -657,6 +665,7 @@ mod tests { Term::prop(arena) ) .into() + trace: vec![Trace::Left, Trace::Right] }) ); }); @@ -686,7 +695,8 @@ mod tests { arena.build_term_raw(prod(prop(), prop())) ) ) - .into() + .into(), + trace: vec![Trace::Right] }) ); }); @@ -704,6 +714,7 @@ mod tests { term.infer(arena), Err(Error { kind: TypeCheckerError::NotUniverse(arena.build_term_raw(var(2.into(), prop()))).into() + trace: vec![Trace::Left, Trace::Right, Trace::Right] }) ); }); @@ -718,6 +729,7 @@ mod tests { term.infer(arena), Err(Error { kind: TypeCheckerError::NotUniverse(arena.build_term_raw(prod(prop(), prop()))).into() + trace: vec![Trace::Left] }) ); }); @@ -734,6 +746,7 @@ mod tests { term.infer(arena), Err(Error { kind: TypeCheckerError::NotUniverse(prop.prod(type_, arena)).into() + trace: vec![Trace::Right] }) ); }); @@ -753,6 +766,7 @@ mod tests { Term::prop(arena) ) .into(), + trace: vec![Trace::Left] }) ); }); @@ -766,6 +780,7 @@ mod tests { prop.check(prop, arena), Err(Error { kind: TypeCheckerError::TypeMismatch(Term::type_usize(0, arena), prop).into(), + trace: vec![] }) ); });