Added separate self param

This commit is contained in:
2026-06-25 19:08:52 +02:00
parent 2c11131e1a
commit 4ab7827955
4 changed files with 31 additions and 48 deletions
+2 -15
View File
@@ -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()),
},
+1
View File
@@ -100,6 +100,7 @@ pub struct FunctionDecl {
pub is_override: Option<Override>,
pub name: Identifier,
pub generics: GenericsDecl,
pub self_param: Option<(bool, Option<Identifier>, bool)>,
pub params: ParamList,
pub return_type: Option<TypeExpr>,
pub body: Option<Block>,
+9 -32
View File
@@ -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<pest::iterators::Pair<'a, Rule>> for FunctionDecl {
@@ -25,43 +25,19 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> 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> {
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<pest::iterators::Pair<'a, Rule>> for FunctionDecl {
return_type: return_type,
name: name,
generics: generics,
self_param: self_param,
params: params,
body: body,
})
+19 -1
View File
@@ -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<T>> {
let pair = consume_rule(pairs, rule);
if let Some(pair) = pair {
Some(map(pair)).transpose()
} else {
Ok(None)
}
}
impl<T> Spanned<T> {
fn new_pair(pair: pest::iterators::Pair<'_, Rule>, item: T) -> Self {
let span = pair.as_span().start_pos().line_col();