From f825b882034008f2606b4e43130a68eff4a8599b Mon Sep 17 00:00:00 2001 From: oflatt Date: Mon, 29 Jan 2024 12:52:05 -0800 Subject: [PATCH] add error checking file oops --- tree_shared/src/error_checking.rs | 58 +++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 tree_shared/src/error_checking.rs diff --git a/tree_shared/src/error_checking.rs b/tree_shared/src/error_checking.rs new file mode 100644 index 000000000..319b211c7 --- /dev/null +++ b/tree_shared/src/error_checking.rs @@ -0,0 +1,58 @@ +//! Rules that perform sanity checks, +//! such as checking that switch children +//! are all `Branch`es. + +use strum::IntoEnumIterator; + +use crate::ir::{Constructor, ESort}; + +pub(crate) fn error_checking_rules() -> Vec { + let mut res = vec![format!( + " +(relation IsBranchList (ListExpr)) + +(rule ((Switch pred outputs)) + ((IsBranchList outputs)) + :ruleset error-checking) + +(rule ((IsBranchList (Cons a rest))) + ((IsBranchList rest)) + :ruleset error-checking) + " + )]; + + for ctor in Constructor::iter() { + if ctor.sort() == ESort::ListExpr { + continue; + } + if ctor == Constructor::Branch { + continue; + } + + let pat = ctor.construct(|field| field.var()); + res.push(format!( + " +(rule ((IsBranchList (Cons {pat} rest))) + ((panic \"Expected Branch, got {ctor}\")) + :ruleset error-checking) +" + )); + } + + res +} + +#[test] +#[should_panic(expected = "Expected Branch, got Num")] +fn test_switch_with_num_child() { + let build = " + (Switch + (Num (Shared) 0) + (Cons + (Num (Shared) 1) + (Cons + (Branch (Shared) (Num (Shared) 2)) + (Nil)))) + "; + crate::run_test(build, "").unwrap() +}