Fix generics and fn types
This commit is contained in:
@@ -24,7 +24,21 @@ impl GetRust for GenericsDecl {
|
|||||||
impl GetRust for GenericDecl {
|
impl GetRust for GenericDecl {
|
||||||
fn get_rust(&self) -> String {
|
fn get_rust(&self) -> String {
|
||||||
match self {
|
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) => {
|
GenericDecl::Type(name, requirements) => {
|
||||||
name.get_rust()
|
name.get_rust()
|
||||||
+ &(if requirements.len() != 0 {
|
+ &(if requirements.len() != 0 {
|
||||||
@@ -32,7 +46,7 @@ impl GetRust for GenericDecl {
|
|||||||
": {}",
|
": {}",
|
||||||
requirements
|
requirements
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(TypeExpr::get_rust)
|
.map(GetRust::get_rust)
|
||||||
.collect::<Vec<_>>()
|
.collect::<Vec<_>>()
|
||||||
.join("+")
|
.join("+")
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ pub struct Spanned<T> {
|
|||||||
impl From<GenericDecl> for Generic {
|
impl From<GenericDecl> for Generic {
|
||||||
fn from(value: GenericDecl) -> Self {
|
fn from(value: GenericDecl) -> Self {
|
||||||
match value {
|
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)),
|
GenericDecl::Type(ty, _) => Generic::Type(TypeExpr::Path(Path(vec![ty]), None)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,8 +82,8 @@ pub struct GenericsDecl(pub Vec<GenericDecl>);
|
|||||||
|
|
||||||
#[derive(Debug, Clone, Serialize)]
|
#[derive(Debug, Clone, Serialize)]
|
||||||
pub enum GenericDecl {
|
pub enum GenericDecl {
|
||||||
Lifetime(Identifier),
|
Lifetime(Identifier, Vec<Generic>),
|
||||||
Type(Identifier, Vec<TypeExpr>),
|
Type(Identifier, Vec<Generic>),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize)]
|
#[derive(Debug, Clone, Serialize)]
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ mutable = { "mut" }
|
|||||||
// ======================================================
|
// ======================================================
|
||||||
// GENERICS
|
// GENERICS
|
||||||
// ======================================================
|
// ======================================================
|
||||||
generic_decl = { lifetime | (identifier ~ (":" ~ generic ~ ("+" ~ generic)*)?) }
|
generic_decl = { (lifetime | identifier) ~ (":" ~ generic ~ ("+" ~ generic)*)? }
|
||||||
generics_decl = { "<" ~ (generic_decl ~ ("," ~ generic_decl)*)? ~ ">" }
|
generics_decl = { "<" ~ (generic_decl ~ ("," ~ generic_decl)*)? ~ ">" }
|
||||||
|
|
||||||
generic = { lifetime | type_expr }
|
generic = { lifetime | type_expr }
|
||||||
@@ -125,9 +125,9 @@ fn_kind_mut = { "FnMut" }
|
|||||||
fn_kind = _{
|
fn_kind = _{
|
||||||
fn_kind_fn
|
fn_kind_fn
|
||||||
| fn_kind_unsafe
|
| fn_kind_unsafe
|
||||||
| fn_kind_closure
|
|
||||||
| fn_kind_once
|
| fn_kind_once
|
||||||
| fn_kind_mut
|
| fn_kind_mut
|
||||||
|
| fn_kind_closure
|
||||||
}
|
}
|
||||||
|
|
||||||
fn_type = {
|
fn_type = {
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for GenericDecl {
|
|||||||
if let Some(pair) = consume_rule(&mut inner, Rule::lifetime) {
|
if let Some(pair) = consume_rule(&mut inner, Rule::lifetime) {
|
||||||
Ok(GenericDecl::Lifetime(
|
Ok(GenericDecl::Lifetime(
|
||||||
pair.into_inner().next().unwrap().try_into()?,
|
pair.into_inner().next().unwrap().try_into()?,
|
||||||
|
collect_recovered(inner)?,
|
||||||
))
|
))
|
||||||
} else {
|
} else {
|
||||||
Ok(GenericDecl::Type(
|
Ok(GenericDecl::Type(
|
||||||
|
|||||||
Reference in New Issue
Block a user