From 2fb38b6974e2cb1ab68b4e950fe0e1966554189f Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Sun, 10 May 2026 16:38:13 +0200 Subject: [PATCH] Class fields --- parser/src/ast.rs | 15 ++++++++++++++- parser/src/grammar.pest | 7 +++++-- parser/src/lib.rs | 42 ++++++++++++++++++++++++++++++++++++++++- src/codegen.rs | 2 +- 4 files changed, 61 insertions(+), 5 deletions(-) diff --git a/parser/src/ast.rs b/parser/src/ast.rs index db081d9..7e64561 100644 --- a/parser/src/ast.rs +++ b/parser/src/ast.rs @@ -94,7 +94,7 @@ pub enum TopLevelKind { visibility: Visibility, name: Identifier, generics: Generics, - fields: Vec, + fields: Vec, constructor: ClassConstructor, methods: Vec, }, @@ -208,6 +208,19 @@ pub struct VarDeclStmt { pub init: Option, } +#[derive(Debug, Clone, Serialize)] +pub struct FieldDecl { + pub visibility: Visibility, + pub type_: TypeExpr, + pub name: Identifier, +} + +#[derive(Debug, Clone, Serialize)] +pub struct FieldDeclStmt { + pub decl: FieldDecl, + pub init: Option, +} + #[derive(Debug, Clone, Serialize)] pub struct VarAssignStmt { pub target: Expression, diff --git a/parser/src/grammar.pest b/parser/src/grammar.pest index 5c6e8f7..7d99a5d 100644 --- a/parser/src/grammar.pest +++ b/parser/src/grammar.pest @@ -149,7 +149,6 @@ attributes = { // ====================================================== // DECLARATION HELPERS // ====================================================== - var_decl = { (var | type_expr) ~ mutable? ~ pattern } @@ -225,7 +224,11 @@ class_constructor = { } class_fields = { - var_decl_statement* + class_field* +} + +class_field = { + field ~ ("=" ~ expr)? ~ semicolon } self_param = { diff --git a/parser/src/lib.rs b/parser/src/lib.rs index e17057c..85645db 100644 --- a/parser/src/lib.rs +++ b/parser/src/lib.rs @@ -300,7 +300,7 @@ impl From> for TopLevelKind { .next() .unwrap() .into_inner() - .map(VarDeclStmt::from) + .map(FieldDeclStmt::from) .collect(), constructor: ClassConstructor::from(inner.next().unwrap()), methods: inner.into_iter().map(FunctionDecl::from).collect(), @@ -583,6 +583,24 @@ impl From> for VarDeclStmt { } } +impl From> for FieldDeclStmt { + fn from(pair: pest::iterators::Pair<'_, Rule>) -> Self { + match pair.as_rule() { + Rule::class_field => { + let mut inner = pair.into_inner(); + + let decl = FieldDecl::from(inner.next().unwrap()); + + let init = inner.next().map(Expression::from); + + FieldDeclStmt { decl, init } + } + + _ => unimplemented!(), + } + } +} + impl From> for Pattern { fn from(pair: pest::iterators::Pair<'_, Rule>) -> Self { let rule = pair.as_rule(); @@ -641,6 +659,28 @@ impl From> for VarDecl { } } +impl From> for FieldDecl { + fn from(pair: pest::iterators::Pair<'_, Rule>) -> Self { + match pair.as_rule() { + Rule::field => { + let mut inner = pair.into_inner(); + + let visibility = Visibility::from(&mut inner); + let type_ = TypeExpr::from(inner.next().unwrap()); + let name = Identifier::from(inner.next().unwrap()); + + FieldDecl { + visibility, + type_, + name, + } + } + + _ => unimplemented!("{:?}", pair.as_rule()), + } + } +} + impl From> for FunctionDecl { fn from(pair: pest::iterators::Pair<'_, Rule>) -> Self { let mut inner = pair.into_inner(); diff --git a/src/codegen.rs b/src/codegen.rs index 437a99f..dffe6db 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -375,7 +375,7 @@ impl ToRust for TopLevelKind { cg.indent += 1; for field in fields { - let ty = field.decl.type_.clone().unwrap().get_rust(); + let ty = field.decl.type_.clone().get_rust(); cg.add_indentedln(&format!("pub {}: {},", field.decl.name.get_rust(), ty)); }