From e37be3f101ac846c50982119683b2b6b0692dc48 Mon Sep 17 00:00:00 2001
From: Russel Arbore <russel.jma@gmail.com>
Date: Mon, 11 Sep 2023 08:54:14 -0500
Subject: [PATCH] Parse summation constant

---
 hercules_ir/src/parse.rs | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/hercules_ir/src/parse.rs b/hercules_ir/src/parse.rs
index 3cd73720..2e625f70 100644
--- a/hercules_ir/src/parse.rs
+++ b/hercules_ir/src/parse.rs
@@ -496,6 +496,12 @@ fn parse_constant<'a>(
             tys,
             context,
         )?,
+        Type::Summation(tys) => parse_summation_constant(
+            ir_text,
+            context.borrow_mut().get_type_id(ty.clone()),
+            tys,
+            context,
+        )?,
         _ => todo!(),
     };
     context.borrow_mut().get_type_id(ty);
@@ -602,6 +608,36 @@ fn parse_product_constant<'a>(
     ))
 }
 
+fn parse_summation_constant<'a>(
+    ir_text: &'a str,
+    sum_ty: TypeID,
+    tys: Box<[TypeID]>,
+    context: &RefCell<Context<'a>>,
+) -> nom::IResult<&'a str, Constant> {
+    let ir_text = nom::character::complete::multispace0(ir_text)?.0;
+    let ir_text = nom::bytes::complete::tag("sum")(ir_text)?.0;
+    let ir_text = nom::character::complete::multispace0(ir_text)?.0;
+    let ir_text = nom::character::complete::char('(')(ir_text)?.0;
+    let ir_text = nom::character::complete::multispace0(ir_text)?.0;
+    let (ir_text, variant) = parse_prim::<u32>(ir_text, "1234567890")?;
+    let ir_text = nom::character::complete::multispace0(ir_text)?.0;
+    let ir_text = nom::character::complete::char(',')(ir_text)?.0;
+    let ir_text = nom::character::complete::multispace0(ir_text)?.0;
+    let (ir_text, id) = parse_constant_id(
+        ir_text,
+        context
+            .borrow()
+            .reverse_type_map
+            .get(&tys[variant as usize])
+            .unwrap()
+            .clone(),
+        context,
+    )?;
+    let ir_text = nom::character::complete::multispace0(ir_text)?.0;
+    let ir_text = nom::character::complete::char(')')(ir_text)?.0;
+    Ok((ir_text, Constant::Summation(sum_ty, variant, id)))
+}
+
 mod tests {
     #[allow(unused_imports)]
     use super::*;
-- 
GitLab