diff --git a/crates/conjure-cp-core/src/ast/expressions.rs b/crates/conjure-cp-core/src/ast/expressions.rs index ee56c72eb5..fde6d9536b 100644 --- a/crates/conjure-cp-core/src/ast/expressions.rs +++ b/crates/conjure-cp-core/src/ast/expressions.rs @@ -663,14 +663,28 @@ impl Expression { /// Returns the possible values of the expression, recursing to leaf expressions pub fn domain_of(&self) -> Option { match self { - Expression::Union(_, a, b) => Some(Domain::set( - SetAttr::::default(), - a.domain_of()?.union(&b.domain_of()?).ok()?, - )), - Expression::Intersect(_, a, b) => Some(Domain::set( - SetAttr::::default(), - a.domain_of()?.intersect(&b.domain_of()?).ok()?, - )), + Expression::Union(_, a, b) => { + // Ascertain range + let (a_attr, _) = a.domain_of()?.as_set()?; + let (b_attr, _) = b.domain_of()?.as_set()?; + let a_range = a_attr.resolve()?.size; + let b_range = b_attr.resolve()?.size; + let new_range = Range::spanning(&[a_range, b_range]); + + // Create + Some(Domain::set( + SetAttr::new(new_range), + a.domain_of()?.union(&b.domain_of()?).ok()?, + )) + } + Expression::Intersect(_, a, b) => { + // thinking about Range::overlaps? + + Some(Domain::set( + SetAttr::::default(), + a.domain_of()?.intersect(&b.domain_of()?).ok()?, + )) + } Expression::In(_, _, _) => Some(Domain::bool()), Expression::Supset(_, _, _) => Some(Domain::bool()), Expression::SupsetEq(_, _, _) => Some(Domain::bool()),