Class fields

This commit is contained in:
2026-05-10 16:38:13 +02:00
parent 476d984d4a
commit 2fb38b6974
4 changed files with 61 additions and 5 deletions
+14 -1
View File
@@ -94,7 +94,7 @@ pub enum TopLevelKind {
visibility: Visibility, visibility: Visibility,
name: Identifier, name: Identifier,
generics: Generics, generics: Generics,
fields: Vec<VarDeclStmt>, fields: Vec<FieldDeclStmt>,
constructor: ClassConstructor, constructor: ClassConstructor,
methods: Vec<FunctionDecl>, methods: Vec<FunctionDecl>,
}, },
@@ -208,6 +208,19 @@ pub struct VarDeclStmt {
pub init: Option<Expression>, pub init: Option<Expression>,
} }
#[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<Expression>,
}
#[derive(Debug, Clone, Serialize)] #[derive(Debug, Clone, Serialize)]
pub struct VarAssignStmt { pub struct VarAssignStmt {
pub target: Expression, pub target: Expression,
+5 -2
View File
@@ -149,7 +149,6 @@ attributes = {
// ====================================================== // ======================================================
// DECLARATION HELPERS // DECLARATION HELPERS
// ====================================================== // ======================================================
var_decl = { var_decl = {
(var | type_expr) ~ mutable? ~ pattern (var | type_expr) ~ mutable? ~ pattern
} }
@@ -225,7 +224,11 @@ class_constructor = {
} }
class_fields = { class_fields = {
var_decl_statement* class_field*
}
class_field = {
field ~ ("=" ~ expr)? ~ semicolon
} }
self_param = { self_param = {
+41 -1
View File
@@ -300,7 +300,7 @@ impl From<pest::iterators::Pair<'_, Rule>> for TopLevelKind {
.next() .next()
.unwrap() .unwrap()
.into_inner() .into_inner()
.map(VarDeclStmt::from) .map(FieldDeclStmt::from)
.collect(), .collect(),
constructor: ClassConstructor::from(inner.next().unwrap()), constructor: ClassConstructor::from(inner.next().unwrap()),
methods: inner.into_iter().map(FunctionDecl::from).collect(), methods: inner.into_iter().map(FunctionDecl::from).collect(),
@@ -583,6 +583,24 @@ impl From<pest::iterators::Pair<'_, Rule>> for VarDeclStmt {
} }
} }
impl From<pest::iterators::Pair<'_, Rule>> 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<pest::iterators::Pair<'_, Rule>> for Pattern { impl From<pest::iterators::Pair<'_, Rule>> for Pattern {
fn from(pair: pest::iterators::Pair<'_, Rule>) -> Self { fn from(pair: pest::iterators::Pair<'_, Rule>) -> Self {
let rule = pair.as_rule(); let rule = pair.as_rule();
@@ -641,6 +659,28 @@ impl From<pest::iterators::Pair<'_, Rule>> for VarDecl {
} }
} }
impl From<pest::iterators::Pair<'_, Rule>> 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<pest::iterators::Pair<'_, Rule>> for FunctionDecl { impl From<pest::iterators::Pair<'_, Rule>> for FunctionDecl {
fn from(pair: pest::iterators::Pair<'_, Rule>) -> Self { fn from(pair: pest::iterators::Pair<'_, Rule>) -> Self {
let mut inner = pair.into_inner(); let mut inner = pair.into_inner();
+1 -1
View File
@@ -375,7 +375,7 @@ impl ToRust for TopLevelKind {
cg.indent += 1; cg.indent += 1;
for field in fields { 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)); cg.add_indentedln(&format!("pub {}: {},", field.decl.name.get_rust(), ty));
} }