diff options
Diffstat (limited to 'crates/rebel-lang/src/typing.rs')
-rw-r--r-- | crates/rebel-lang/src/typing.rs | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/crates/rebel-lang/src/typing.rs b/crates/rebel-lang/src/typing.rs index 1455732..94c84ba 100644 --- a/crates/rebel-lang/src/typing.rs +++ b/crates/rebel-lang/src/typing.rs @@ -29,7 +29,7 @@ pub enum Type { Str, Tuple(Vec<Type>), Array(Box<Type>, ArrayLen), - Map(HashMap<String, Type>), + Struct(HashMap<String, Type>), Fn(Box<FuncType>), } @@ -60,19 +60,21 @@ impl Type { Box::new(self_inner.unify(*other_inner, coerce)?), ArrayLen::unify(self_len, other_len, coerce)?, ), - (Map(self_entries), Map(mut other_entries)) => { + (Struct(self_entries), Struct(mut other_entries)) => { if self_entries.len() != other_entries.len() { return Err(TypeError); } - Map(self_entries - .into_iter() - .map(|(k, v)| { - let Some(v2) = other_entries.remove(&k) else { - return Err(TypeError); - }; - Ok((k, v.unify(v2, coerce)?)) - }) - .collect::<Result<_>>()?) + Struct( + self_entries + .into_iter() + .map(|(k, v)| { + let Some(v2) = other_entries.remove(&k) else { + return Err(TypeError); + }; + Ok((k, v.unify(v2, coerce)?)) + }) + .collect::<Result<_>>()?, + ) } _ => return Err(TypeError), }) @@ -247,7 +249,7 @@ impl Type { let index: usize = name.parse().or(Err(TypeError))?; elems.into_iter().nth(index).ok_or(TypeError)? } - Map(mut entries) => entries.remove(name).ok_or(TypeError)?, + Struct(mut entries) => entries.remove(name).ok_or(TypeError)?, _ => return Err(TypeError), }) } @@ -308,12 +310,14 @@ impl Type { })?), ArrayLen::Fixed(elems.len()), ), - Literal::Map(entries) => Map(entries - .iter() - .map(|ast::MapEntry { key, value }| { - Ok(((*key).to_owned(), Self::ast_expr_type(ctx, value)?)) - }) - .collect::<Result<_>>()?), + Literal::Struct(entries) => Struct( + entries + .iter() + .map(|ast::StructField { key, value }| { + Ok(((*key).to_owned(), Self::ast_expr_type(ctx, value)?)) + }) + .collect::<Result<_>>()?, + ), }) } } @@ -342,7 +346,7 @@ impl Display for Type { f.write_str(")") } Type::Array(typ, len) => write!(f, "[{typ}{len}]"), - Type::Map(entries) => { + Type::Struct(entries) => { let mut first = true; f.write_str("{")?; for (key, typ) in entries { |