From b0f3dccc87515efc03296048b9ed1733c22b39d1 Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Thu, 28 May 2026 15:55:00 +0200 Subject: [PATCH] Inheritance parsing --- crates/codegen/src/top_level.rs | 1 + crates/parser/src/ast/top_level.rs | 1 + crates/parser/src/grammar.pest | 2 +- crates/parser/src/parser/items/mod.rs | 4 ++++ 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/crates/codegen/src/top_level.rs b/crates/codegen/src/top_level.rs index b13c531..39c0880 100644 --- a/crates/codegen/src/top_level.rs +++ b/crates/codegen/src/top_level.rs @@ -325,6 +325,7 @@ impl GenRust for TopLevelKind { visibility, name, generics, + inherits, fields, constructor, items, diff --git a/crates/parser/src/ast/top_level.rs b/crates/parser/src/ast/top_level.rs index 8de8531..f87d011 100644 --- a/crates/parser/src/ast/top_level.rs +++ b/crates/parser/src/ast/top_level.rs @@ -54,6 +54,7 @@ pub enum TopLevelKind { visibility: Visibility, name: Identifier, generics: GenericsDecl, + inherits: Option, fields: Vec>, constructor: Spanned, items: Vec, diff --git a/crates/parser/src/grammar.pest b/crates/parser/src/grammar.pest index 9635b1d..ee1af10 100644 --- a/crates/parser/src/grammar.pest +++ b/crates/parser/src/grammar.pest @@ -285,7 +285,7 @@ class_item = _{ } class_decl = { - visibility? ~ "class" ~ identifier ~ generics_decl? ~ "{" ~ class_fields ~ class_constructor ~ class_item* ~ "}" + visibility? ~ "class" ~ identifier ~ generics_decl? ~ (":" ~ type_expr)? ~ "{" ~ class_fields ~ class_constructor ~ class_item* ~ "}" } // ====================================================== diff --git a/crates/parser/src/parser/items/mod.rs b/crates/parser/src/parser/items/mod.rs index fe45403..7b49a1a 100644 --- a/crates/parser/src/parser/items/mod.rs +++ b/crates/parser/src/parser/items/mod.rs @@ -69,6 +69,10 @@ impl<'a> TryFrom> for TopLevelKind { .transpose() .map(|v| v.unwrap_or_default()), + inherits: consume_rule(&mut inner, Rule::type_expr) + .map(TypeExpr::try_from) + .transpose(), + fields: collect_recovered(inner.next().unwrap().into_inner()), constructor: inner.next().unwrap().try_into(),