From bb9ad547a3fb171a981deeb6d03953123c7c64be Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Sun, 10 May 2026 17:25:34 +0200 Subject: [PATCH] External impl --- parser/src/ast.rs | 2 +- parser/src/lib.rs | 28 +++++++++++++++++++++++++--- src/codegen.rs | 2 +- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/parser/src/ast.rs b/parser/src/ast.rs index eed2c93..abcce46 100644 --- a/parser/src/ast.rs +++ b/parser/src/ast.rs @@ -94,7 +94,7 @@ pub enum TopLevelKind { generics: Generics, fields: Vec, constructor: ClassConstructor, - methods: Vec, + items: Vec, }, } diff --git a/parser/src/lib.rs b/parser/src/lib.rs index 7756176..c26d368 100644 --- a/parser/src/lib.rs +++ b/parser/src/lib.rs @@ -289,7 +289,7 @@ impl From> for TopLevelKind { .map(FieldDeclStmt::from) .collect(), constructor: ClassConstructor::from(inner.next().unwrap()), - methods: inner.into_iter().map(FunctionDecl::from).collect(), + items: inner.into_iter().map(FunctionDecl::from).collect(), }, Rule::enum_decl => TopLevelKind::EnumDecl { @@ -303,14 +303,36 @@ impl From> for TopLevelKind { Rule::mod_package => TopLevelKind::Mod(Identifier::from(inner.next().unwrap())), - Rule::impl_for_decl => TopLevelKind::ImplDecl(ImplDecl { + Rule::impl_for_decl | Rule::impl_decl => TopLevelKind::ImplDecl(ImplDecl::from(pair)), + + _ => unimplemented!("{rule:#?}"), + } + } +} + +impl From> for ImplDecl { + fn from(pair: pest::iterators::Pair<'_, Rule>) -> Self { + let rule = pair.as_rule(); + let mut inner = pair.clone().into_inner(); + + match rule { + Rule::impl_for_decl => ImplDecl { generics: consume_rule(&mut inner, Rule::generics) .map(Generics::from) .unwrap_or_default(), trait_: Some(TypeExpr::from(inner.next().unwrap())), target: TypeExpr::from(inner.next().unwrap()), methods: inner.map(FunctionDecl::from).collect(), - }), + }, + + Rule::impl_decl => ImplDecl { + generics: consume_rule(&mut inner, Rule::generics) + .map(Generics::from) + .unwrap_or_default(), + trait_: None, + target: TypeExpr::from(inner.next().unwrap()), + methods: inner.map(FunctionDecl::from).collect(), + }, _ => unimplemented!("{rule:#?}"), } diff --git a/src/codegen.rs b/src/codegen.rs index af5c39b..304a904 100644 --- a/src/codegen.rs +++ b/src/codegen.rs @@ -364,7 +364,7 @@ impl ToRust for TopLevelKind { generics, fields, constructor, - methods, + items: methods, } => { // Struct decl cg.addln(&format!(