Generic lifetimes

This commit is contained in:
2026-05-08 20:08:03 +02:00
parent 0bf32b16cd
commit 020dd3b76b
5 changed files with 46 additions and 21 deletions
+7 -1
View File
@@ -98,7 +98,13 @@ pub enum TopLevelKind {
} }
#[derive(Debug, Clone, Serialize, Default)] #[derive(Debug, Clone, Serialize, Default)]
pub struct Generics(pub Vec<(Identifier, Vec<Path>)>); pub struct Generics(pub Vec<Generic>);
#[derive(Debug, Clone, Serialize)]
pub enum Generic {
Lifetime(Identifier),
Type(Identifier, Vec<TypeExpr>),
}
#[derive(Debug, Clone, Serialize)] #[derive(Debug, Clone, Serialize)]
pub enum Pattern { pub enum Pattern {
+11 -2
View File
@@ -55,7 +55,7 @@ var = { "var" }
// ====================================================== // ======================================================
// GENERICS // GENERICS
// ====================================================== // ======================================================
generic = { identifier ~ (":" ~ static_path ~ ("+" ~ static_path)*)? } generic = { lifetime | (identifier ~ (":" ~ type_expr_param ~ ("+" ~ type_expr_param)*)?) }
generics = { "<" ~ (generic ~ ("," ~ generic)*)? ~ ">" } generics = { "<" ~ (generic ~ ("," ~ generic)*)? ~ ">" }
// ====================================================== // ======================================================
@@ -67,7 +67,7 @@ tuple_type = {
} }
path_type = { path_type = {
static_path ~ ("<" ~ (type_expr ~ ("," ~ type_expr)*)? ~ ">")? static_path ~ ("<" ~ (type_expr_param ~ ("," ~ type_expr_param)*)? ~ ">")?
} }
ref_type = { ref_type = {
@@ -78,6 +78,15 @@ type_expr = {
(path_type | tuple_type) ~ ref_type* (path_type | tuple_type) ~ ref_type*
} }
lifetime = {
"'" ~ identifier
}
type_expr_param = {
type_expr
| lifetime
}
// ====================================================== // ======================================================
// LITERALS // LITERALS
// ====================================================== // ======================================================
+8 -4
View File
@@ -238,10 +238,14 @@ impl From<pest::iterators::Pair<'_, Rule>> for Generics {
inner inner
.map(|pair| { .map(|pair| {
let mut inner = pair.into_inner(); let mut inner = pair.into_inner();
( if let Some(pair) = consume_rule(&mut inner, Rule::lifetime) {
Identifier::from(inner.next().unwrap()), Generic::Lifetime(Identifier::from(pair.into_inner().next().unwrap()))
inner.map(Path::from).collect(), } else {
) Generic::Type(
Identifier::from(inner.next().unwrap()),
inner.map(TypeExpr::from).collect(),
)
}
}) })
.collect(), .collect(),
), ),
+18 -14
View File
@@ -721,20 +721,24 @@ impl GetRust for Generics {
"<{}>", "<{}>",
self.0 self.0
.iter() .iter()
.map(|generic| generic.0.get_rust() .map(|generic| match generic {
+ &(if generic.1.len() == 0 { parser::ast::Generic::Lifetime(name) => format!("'{}", name.get_rust()),
String::new() parser::ast::Generic::Type(name, requirements) => {
} else { name.get_rust()
format!( + &(if requirements.len() == 0 {
": {}", String::new()
generic } else {
.1 format!(
.iter() ": {}",
.map(Path::get_rust) requirements
.collect::<Vec<_>>() .iter()
.join("+") .map(TypeExpr::get_rust)
) .collect::<Vec<_>>()
})) .join("+")
)
})
}
})
.collect::<Vec<_>>() .collect::<Vec<_>>()
.join(", ") .join(", ")
) )
+2
View File
@@ -2,6 +2,8 @@ mod my_class;
use <my_class::MyClass>; use <my_class::MyClass>;
use <my_class::MyEnum>; use <my_class::MyEnum>;
struct Test<'a> {}
void main() { void main() {
var my_class = new MyClass("World"); var my_class = new MyClass("World");
my_class.greet(); my_class.greet();