From 4ab7827955dae58f1a310861ab9b5feeaaa772c8 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Thu, 25 Jun 2026 19:08:52 +0200 Subject: [PATCH] Added separate self param --- crates/codegen/src/class_decl.rs | 17 ++------- crates/parser/src/ast/top_level.rs | 1 + crates/parser/src/parser/items/function.rs | 41 +++++----------------- crates/parser/src/parser/mod.rs | 20 ++++++++++- 4 files changed, 31 insertions(+), 48 deletions(-) diff --git a/crates/codegen/src/class_decl.rs b/crates/codegen/src/class_decl.rs index e0166a7..cf773b0 100644 --- a/crates/codegen/src/class_decl.rs +++ b/crates/codegen/src/class_decl.rs @@ -375,20 +375,6 @@ impl ClassProcessedData { cg.indent -= 1; cg.add_indentedln("}\n"); - let mut constructor_params = vec![VarDecl { - name: Pattern::Path(false, Path(vec![Identifier(String::from("self"))])), - type_: Some(TypeExpr::Ref { - lifetime: None, - mutable: true, - ty: Box::new(TypeExpr::Path( - Path(vec![Identifier(String::from("Self"))]), - None, - )), - }), - }]; - - constructor_params.append(&mut constructor.item.params.0.clone()); - Spanned { line: constructor.line, column: constructor.column, @@ -397,7 +383,8 @@ impl ClassProcessedData { is_override: None, name: Identifier(String::from("constructor")), generics: constructor.item.generics.clone(), - params: ParamList(constructor_params), + params: constructor.item.params.clone(), + self_param: Some((true, None, true)), return_type: Some(TypeExpr::Tuple(Vec::new())), body: Some(constructor.item.body.clone()), }, diff --git a/crates/parser/src/ast/top_level.rs b/crates/parser/src/ast/top_level.rs index 31847bf..a93fcaf 100644 --- a/crates/parser/src/ast/top_level.rs +++ b/crates/parser/src/ast/top_level.rs @@ -100,6 +100,7 @@ pub struct FunctionDecl { pub is_override: Option, pub name: Identifier, pub generics: GenericsDecl, + pub self_param: Option<(bool, Option, bool)>, pub params: ParamList, pub return_type: Option, pub body: Option, diff --git a/crates/parser/src/parser/items/function.rs b/crates/parser/src/parser/items/function.rs index 1486477..dca1d06 100644 --- a/crates/parser/src/parser/items/function.rs +++ b/crates/parser/src/parser/items/function.rs @@ -3,7 +3,7 @@ use crate::{ ast::*, ast_ensure, error::{self, AstError, AstResult}, - parser::{consume_rule, listen_rule}, + parser::{consume_rule, consume_rule_map, listen_rule}, }; impl<'a> TryFrom> for FunctionDecl { @@ -25,43 +25,19 @@ impl<'a> TryFrom> for FunctionDecl { .transpose() .map(|v| v.unwrap_or_default())?; - let self_param = consume_rule(&mut inner, Rule::self_param).map(|param| { + let self_param = consume_rule_map(&mut inner, Rule::self_param, |param| { let mut param_inner = param.into_inner(); + let is_ref = listen_rule(&mut param_inner, Rule::ref_px); let lifetime = consume_rule(&mut param_inner, Rule::lifetime); let mutable = listen_rule(&mut param_inner, Rule::mutable); - let name = Pattern::Path(mutable && !is_ref, Path(vec![Identifier(String::from("self"))])); - let self_ty = TypeExpr::Path(Path(vec![Identifier(String::from("Self"))]), None); - VarDecl { - name: name.clone(), - type_: Some(if is_ref { - TypeExpr::Ref { - lifetime: - lifetime.map(|v| Lifetime::try_from(v.into_inner().next().unwrap())) - .transpose() - .expect("Failed to get lifetime identifier"), - mutable, - ty: Box::new(self_ty) - } - } else { - self_ty - }), - } - }); + Ok((is_ref, lifetime.map(|v| -> AstResult { + Identifier::try_from(v.into_inner().next().unwrap()) + }).transpose()?, mutable)) + })?; - let params = consume_rule(&mut inner, Rule::param_list) - .map({ - let self_param = self_param.clone(); - |params_pair| -> AstResult<'a, ParamList> { - let mut params = ParamList::try_from(params_pair)?; - if let Some(x) = self_param { - params.0.insert(0, x); - } - Ok(params) - } - }) - .unwrap_or_else(|| Ok(ParamList(self_param.into_iter().collect())))?; + let params = consume_rule(&mut inner, Rule::param_list).map(ParamList::try_from).transpose()?.unwrap_or_default(); let is_override = consume_rule(&mut inner, Rule::override_kw).map(Override::try_from).transpose()?; @@ -73,6 +49,7 @@ impl<'a> TryFrom> for FunctionDecl { return_type: return_type, name: name, generics: generics, + self_param: self_param, params: params, body: body, }) diff --git a/crates/parser/src/parser/mod.rs b/crates/parser/src/parser/mod.rs index 30562a9..6292ec9 100644 --- a/crates/parser/src/parser/mod.rs +++ b/crates/parser/src/parser/mod.rs @@ -1,7 +1,11 @@ pub mod common; pub mod items; -use crate::{Rule, ast::Spanned, error::AstError}; +use crate::{ + Rule, + ast::Spanned, + error::{AstError, AstResult}, +}; pub fn listen_rule(pairs: &mut pest::iterators::Pairs<'_, Rule>, rule: Rule) -> bool { let consumed = pairs @@ -28,6 +32,20 @@ pub fn consume_rule<'a>( if consumed { pairs.next() } else { None } } +pub fn consume_rule_map<'a, T>( + pairs: &mut pest::iterators::Pairs<'a, Rule>, + rule: Rule, + map: impl Fn(pest::iterators::Pair<'a, Rule>) -> AstResult<'a, T>, +) -> AstResult<'a, Option> { + let pair = consume_rule(pairs, rule); + + if let Some(pair) = pair { + Some(map(pair)).transpose() + } else { + Ok(None) + } +} + impl Spanned { fn new_pair(pair: pest::iterators::Pair<'_, Rule>, item: T) -> Self { let span = pair.as_span().start_pos().line_col();