From 902199fd98f3520e013e8e6ab6db5f2f8a981060 Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Mon, 4 Sep 2023 11:06:54 -0400 Subject: [PATCH] feat: Handle narrowed and hole shapes for not --- src/ast/typecheck/mod.rs | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/ast/typecheck/mod.rs b/src/ast/typecheck/mod.rs index 51e02f7..0fa7ab9 100644 --- a/src/ast/typecheck/mod.rs +++ b/src/ast/typecheck/mod.rs @@ -62,18 +62,24 @@ fn derive_include_shape( fn derive_not_shape(def: &NotDef, symbol_table: &mut BTreeMap, Shape>) -> Shape { let shape = def.expr.as_ref().derive_shape(symbol_table); - if let Shape::Boolean(b) = shape { - Shape::Boolean(PositionedItem::new(!b.val, def.pos.clone())) - } else { - // TODO(jwall): Display implementations for shapes. - Shape::TypeErr( - def.pos.clone(), - format!( - "Expected Boolean value in Not expression but got: {:?}", - shape - ), - ) - } + if let Shape::Boolean(b) = &shape { + return Shape::Boolean(PositionedItem::new(!b.val, def.pos.clone())); + } else if let Shape::Hole(_) = &shape { + return Shape::Boolean(PositionedItem::new(true, def.pos.clone())); + } else if let Shape::Narrowed(shape_list) = &shape { + for s in shape_list.types.iter() { + if let Shape::Boolean(b) = s { + return Shape::Boolean(PositionedItem::new(!b.val, def.pos.clone())); + } + } + }; + Shape::TypeErr( + def.pos.clone(), + format!( + "Expected Boolean value in Not expression but got: {:?}", + shape + ), + ) } fn derive_copy_shape(def: &CopyDef, symbol_table: &mut BTreeMap, Shape>) -> Shape {