cl-ast: Allow c-like enums to take an expr

This commit is contained in:
John 2025-05-05 02:22:50 -04:00
parent fc80be5fcc
commit d6c0a6cf1b
4 changed files with 7 additions and 10 deletions

View File

@ -183,7 +183,7 @@ pub struct Variant {
#[derive(Clone, Debug, PartialEq, Eq, Hash)] #[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub enum VariantKind { pub enum VariantKind {
Plain, Plain,
CLike(u128), CLike(Box<Expr>),
Tuple(Ty), Tuple(Ty),
Struct(Vec<StructMember>), Struct(Vec<StructMember>),
} }

View File

@ -40,7 +40,6 @@ impl_from! {
// TODO: Struct members in struct // TODO: Struct members in struct
} }
impl From for VariantKind { impl From for VariantKind {
u128 => VariantKind::CLike,
Ty => VariantKind::Tuple, Ty => VariantKind::Tuple,
// TODO: enum struct variants // TODO: enum struct variants
} }

View File

@ -159,7 +159,10 @@ impl Interpret for Enum {
for (idx, Variant { name, kind }) in variants.iter().enumerate() { for (idx, Variant { name, kind }) in variants.iter().enumerate() {
match kind { match kind {
VariantKind::Plain => env.insert(*name, Some(ConValue::Int(idx as _))), VariantKind::Plain => env.insert(*name, Some(ConValue::Int(idx as _))),
VariantKind::CLike(idx) => env.insert(*name, Some(ConValue::Int(*idx as _))), VariantKind::CLike(idx) => {
let idx = idx.interpret(env)?;
env.insert(*name, Some(idx))
}
VariantKind::Tuple(ty) => eprintln!("TODO: Enum-tuple variants: {ty}"), VariantKind::Tuple(ty) => eprintln!("TODO: Enum-tuple variants: {ty}"),
VariantKind::Struct(_) => eprintln!("TODO: Enum-struct members: {kind}"), VariantKind::Struct(_) => eprintln!("TODO: Enum-struct members: {kind}"),
} }

View File

@ -603,13 +603,8 @@ impl Parse<'_> for VariantKind {
const P: Parsing = Parsing::VariantKind; const P: Parsing = Parsing::VariantKind;
Ok(match p.peek_kind(P)? { Ok(match p.peek_kind(P)? {
TokenKind::Eq => { TokenKind::Eq => {
p.match_type(TokenKind::Eq, P)?; p.consume_peeked();
let tok = p.match_type(TokenKind::Literal, P)?; VariantKind::CLike(Box::new(p.parse()?))
VariantKind::CLike(match tok.data() {
TokenData::Integer(i) => *i,
_ => panic!("Expected token data for {tok:?} while parsing {P}"),
})
} }
TokenKind::LCurly => VariantKind::Struct(delim( TokenKind::LCurly => VariantKind::Struct(delim(
sep(StructMember::parse, TokenKind::Comma, TokenKind::RCurly, P), sep(StructMember::parse, TokenKind::Comma, TokenKind::RCurly, P),