Fix generics and fn types

This commit is contained in:
2026-07-09 12:07:37 +02:00
parent d538168692
commit b15f13880a
5 changed files with 22 additions and 7 deletions
+16 -2
View File
@@ -24,7 +24,21 @@ impl GetRust for GenericsDecl {
impl GetRust for GenericDecl {
fn get_rust(&self) -> String {
match self {
GenericDecl::Lifetime(name) => format!("'{}", name.get_rust()),
GenericDecl::Lifetime(name, requirements) => {
format!("'{}", name.get_rust())
+ &(if requirements.len() != 0 {
format!(
": {}",
requirements
.into_iter()
.map(GetRust::get_rust)
.collect::<Vec<_>>()
.join("+")
)
} else {
String::new()
})
}
GenericDecl::Type(name, requirements) => {
name.get_rust()
+ &(if requirements.len() != 0 {
@@ -32,7 +46,7 @@ impl GetRust for GenericDecl {
": {}",
requirements
.into_iter()
.map(TypeExpr::get_rust)
.map(GetRust::get_rust)
.collect::<Vec<_>>()
.join("+")
)
+1 -1
View File
@@ -60,7 +60,7 @@ pub struct Spanned<T> {
impl From<GenericDecl> for Generic {
fn from(value: GenericDecl) -> Self {
match value {
GenericDecl::Lifetime(life) => Generic::Lifetime(life),
GenericDecl::Lifetime(life, _) => Generic::Lifetime(life),
GenericDecl::Type(ty, _) => Generic::Type(TypeExpr::Path(Path(vec![ty]), None)),
}
}
+2 -2
View File
@@ -82,8 +82,8 @@ pub struct GenericsDecl(pub Vec<GenericDecl>);
#[derive(Debug, Clone, Serialize)]
pub enum GenericDecl {
Lifetime(Identifier),
Type(Identifier, Vec<TypeExpr>),
Lifetime(Identifier, Vec<Generic>),
Type(Identifier, Vec<Generic>),
}
#[derive(Debug, Clone, Serialize)]
+2 -2
View File
@@ -90,7 +90,7 @@ mutable = { "mut" }
// ======================================================
// GENERICS
// ======================================================
generic_decl = { lifetime | (identifier ~ (":" ~ generic ~ ("+" ~ generic)*)?) }
generic_decl = { (lifetime | identifier) ~ (":" ~ generic ~ ("+" ~ generic)*)? }
generics_decl = { "<" ~ (generic_decl ~ ("," ~ generic_decl)*)? ~ ">" }
generic = { lifetime | type_expr }
@@ -125,9 +125,9 @@ fn_kind_mut = { "FnMut" }
fn_kind = _{
fn_kind_fn
| fn_kind_unsafe
| fn_kind_closure
| fn_kind_once
| fn_kind_mut
| fn_kind_closure
}
fn_type = {
+1
View File
@@ -131,6 +131,7 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for GenericDecl {
if let Some(pair) = consume_rule(&mut inner, Rule::lifetime) {
Ok(GenericDecl::Lifetime(
pair.into_inner().next().unwrap().try_into()?,
collect_recovered(inner)?,
))
} else {
Ok(GenericDecl::Type(