From 196a92362e4ca2d8744cd9f1627f08cf6856e9eb Mon Sep 17 00:00:00 2001 From: ychenfo Date: Fri, 22 Apr 2022 13:25:35 +0800 Subject: [PATCH 1/2] nac3core: show outter type info in err msg --- nac3core/src/typecheck/typedef/mod.rs | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/nac3core/src/typecheck/typedef/mod.rs b/nac3core/src/typecheck/typedef/mod.rs index f2e7b57..861a2e3 100644 --- a/nac3core/src/typecheck/typedef/mod.rs +++ b/nac3core/src/typecheck/typedef/mod.rs @@ -657,12 +657,16 @@ impl Unifier { return Err(TypeError::new(TypeErrorKind::IncompatibleTypes(a, b), None)); } for (x, y) in ty1.iter().zip(ty2.iter()) { - self.unify_impl(*x, *y, false)?; + if self.unify_impl(*x, *y, false).is_err() { + return Err(TypeError::new(TypeErrorKind::IncompatibleTypes(a, b), None)); + } } self.set_a_to_b(a, b); } (TList { ty: ty1 }, TList { ty: ty2 }) => { - self.unify_impl(*ty1, *ty2, false)?; + if self.unify_impl(*ty1, *ty2, false).is_err() { + return Err(TypeError::new(TypeErrorKind::IncompatibleTypes(a, b), None)); + } self.set_a_to_b(a, b); } (TVar { fields: Some(map), range, .. }, TObj { fields, .. }) => { @@ -743,12 +747,16 @@ impl Unifier { self.incompatible_types(a, b)?; } for (x, y) in zip(params1.values(), params2.values()) { - self.unify_impl(*x, *y, false)?; + if self.unify_impl(*x, *y, false).is_err() { + return Err(TypeError::new(TypeErrorKind::IncompatibleTypes(a, b), None)); + }; } self.set_a_to_b(a, b); } (TVirtual { ty: ty1 }, TVirtual { ty: ty2 }) => { - self.unify_impl(*ty1, *ty2, false)?; + if self.unify_impl(*ty1, *ty2, false).is_err() { + return Err(TypeError::new(TypeErrorKind::IncompatibleTypes(a, b), None)); + }; self.set_a_to_b(a, b); } (TCall(calls1), TCall(calls2)) => { @@ -784,9 +792,13 @@ impl Unifier { if x.name != y.name || x.default_value != y.default_value { return Err(TypeError::new(TypeErrorKind::IncompatibleTypes(a, b), None)); } - self.unify_impl(x.ty, y.ty, false)?; + if self.unify_impl(x.ty, y.ty, false).is_err() { + return Err(TypeError::new(TypeErrorKind::IncompatibleTypes(a, b), None)); + }; } - self.unify_impl(sign1.ret, sign2.ret, false)?; + if self.unify_impl(sign1.ret, sign2.ret, false).is_err() { + return Err(TypeError::new(TypeErrorKind::IncompatibleTypes(a, b), None)); + }; self.set_a_to_b(a, b); } (TVar { fields: Some(fields), .. }, _) => { -- 2.42.0 From 8b6745cbaf4c6f7610a51230733e5067d9d1d638 Mon Sep 17 00:00:00 2001 From: ychenfo Date: Fri, 22 Apr 2022 13:46:52 +0800 Subject: [PATCH 2/2] nac3core: fix broken tests --- nac3core/src/typecheck/typedef/test.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/nac3core/src/typecheck/typedef/test.rs b/nac3core/src/typecheck/typedef/test.rs index 30c183b..52e420a 100644 --- a/nac3core/src/typecheck/typedef/test.rs +++ b/nac3core/src/typecheck/typedef/test.rs @@ -286,7 +286,7 @@ fn test_unify( ("v1", "tuple[int]"), ("v2", "tuple[float]"), ], - (("v1", "v2"), "Incompatible types: 0 and 1") + (("v1", "v2"), "Incompatible types: tuple[0] and tuple[1]") ; "tuple parameter mismatch" )] #[test_case(2, @@ -478,7 +478,8 @@ fn test_typevar_range() { let int_list = env.unifier.add_ty(TypeEnum::TList { ty: int }); assert_eq!( env.unify(a_list, int_list), - Err("Expected any one of these types: 1, but got 0".into()) + Err("Incompatible types: list[typevar22] and list[0]\ + \n\nNotes:\n typevar22 ∈ {1}".into()) ); let a = env.unifier.get_fresh_var_with_range(&[int, float], None, None).0; @@ -506,7 +507,7 @@ fn test_rigid_var() { assert_eq!(env.unify(a, b), Err("Incompatible types: typevar3 and typevar2".to_string())); env.unifier.unify(list_a, list_x).unwrap(); - assert_eq!(env.unify(list_x, list_int), Err("Incompatible types: 0 and typevar2".to_string())); + assert_eq!(env.unify(list_x, list_int), Err("Incompatible types: list[typevar2] and list[0]".to_string())); env.unifier.replace_rigid_var(a, int); env.unifier.unify(list_x, list_int).unwrap(); -- 2.42.0