From f01b9debe28e7b2b31629200bc122af996297e28 Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Tue, 5 May 2026 18:41:08 +0200 Subject: [PATCH] Class AST gen --- parser/src/ast.rs | 9 ++++++++- parser/src/lib.rs | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/parser/src/ast.rs b/parser/src/ast.rs index 0c8ba21..7efafd3 100644 --- a/parser/src/ast.rs +++ b/parser/src/ast.rs @@ -78,10 +78,17 @@ pub enum TopLevelKind { export: bool, name: String, fields: Vec, - constructor: (ParamList, Block), + constructor: ClassConstructor, }, } +#[derive(Debug, Clone, Serialize)] +pub struct ClassConstructor { + pub export: bool, + pub params: ParamList, + pub body: Block, +} + #[derive(Debug, Clone, Serialize)] pub enum Postfix { FieldAccess(String), diff --git a/parser/src/lib.rs b/parser/src/lib.rs index ce1dd56..eaae013 100644 --- a/parser/src/lib.rs +++ b/parser/src/lib.rs @@ -210,6 +210,29 @@ impl From> for StatementBranch { } } +impl From> for ClassConstructor { + fn from(pair: pest::iterators::Pair<'_, Rule>) -> Self { + let mut inner = pair.into_inner(); + + let export = if let Some(first) = inner.peek() { + if first.as_rule() == Rule::export { + inner.next(); + true + } else { + false + } + } else { + false + }; + + Self { + export, + params: ParamList::from(inner.next().unwrap()), + body: Block::from(inner.next().unwrap()), + } + } +} + impl From> for TopLevelKind { fn from(pair: pest::iterators::Pair<'_, Rule>) -> Self { let rule = pair.as_rule(); @@ -271,6 +294,28 @@ impl From> for TopLevelKind { fields, } } + + Rule::class_decl => TopLevelKind::ClassDecl { + export: if let Some(first) = inner.peek() { + if first.as_rule() == Rule::export { + inner.next(); + true + } else { + false + } + } else { + false + }, + name: inner.next().unwrap().as_str().to_string(), + fields: inner + .next() + .unwrap() + .into_inner() + .map(VarDeclStmt::from) + .collect(), + constructor: ClassConstructor::from(inner.next().unwrap()), + }, + _ => unimplemented!("{rule:#?}"), } }