diff --git a/crates/parser/src/grammar.pest b/crates/parser/src/grammar.pest index 07f4b7b..f6cf6b5 100644 --- a/crates/parser/src/grammar.pest +++ b/crates/parser/src/grammar.pest @@ -278,7 +278,7 @@ class_field = { } self_param = { - "self" ~ mutable? ~ deref_px? + (deref_px ~ lifetime?)? ~ mutable? ~ "self" } method_args = _{ diff --git a/crates/parser/src/parser/items/function.rs b/crates/parser/src/parser/items/function.rs index 7dbd50c..3919cce 100644 --- a/crates/parser/src/parser/items/function.rs +++ b/crates/parser/src/parser/items/function.rs @@ -22,15 +22,23 @@ impl<'a> TryFrom> for FunctionDecl { let self_param = consume_rule(&mut inner, Rule::self_param).map(|param| { let mut param_inner = param.into_inner(); - let mutable = listen_rule(&mut param_inner, Rule::mutable); let is_ref = listen_rule(&mut param_inner, Rule::deref_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: None, mutable, ty: Box::new(self_ty) } + TypeExpr::Ref { + lifetime: + lifetime.map(|v| Identifier::try_from(v.into_inner().next().unwrap())) + .transpose() + .expect("Failed to get lifetime identifier"), + mutable, + ty: Box::new(self_ty) + } } else { self_ty }), diff --git a/mist-test/src/main.mist b/mist-test/src/main.mist index 6ea27b3..b6563fc 100644 --- a/mist-test/src/main.mist +++ b/mist-test/src/main.mist @@ -7,3 +7,11 @@ struct MyStruct<'a> { fn add(a i32, b i32) i32 { a + b } + +class MyClass { + name String; + + constructor() {} + + fn my_func(*mut self) {} +}