This commit is contained in:
2026-05-10 17:55:08 +02:00
parent 28d4d784f2
commit e063d4c685
4 changed files with 60 additions and 2 deletions
+2
View File
@@ -1,5 +1,7 @@
use <std::fmt>; use <std::fmt>;
public trait TestLogging: Display {}
public enum LogLevel { public enum LogLevel {
Info, Info,
Warning, Warning,
+14 -1
View File
@@ -75,6 +75,13 @@ pub enum TopLevelKind {
Import(Path), Import(Path),
Mod(Identifier), Mod(Identifier),
ImplDecl(ImplDecl), ImplDecl(ImplDecl),
TraitDecl {
visibility: Visibility,
name: Identifier,
generics: Generics,
requirements: Vec<TypeExpr>,
items: Vec<TraitItem>,
},
EnumDecl { EnumDecl {
visibility: Visibility, visibility: Visibility,
name: Identifier, name: Identifier,
@@ -83,8 +90,8 @@ pub enum TopLevelKind {
}, },
StructDecl { StructDecl {
visibility: Visibility, visibility: Visibility,
generics: Generics,
name: Identifier, name: Identifier,
generics: Generics,
fields: Vec<FieldDecl>, fields: Vec<FieldDecl>,
}, },
FunctionDecl(FunctionDecl), FunctionDecl(FunctionDecl),
@@ -98,6 +105,12 @@ pub enum TopLevelKind {
}, },
} }
#[derive(Debug, Clone, Serialize)]
pub enum TraitItem {
WithBody(FunctionDecl),
NoBody(FunctionDecl),
}
#[derive(Debug, Clone, Serialize)] #[derive(Debug, Clone, Serialize)]
pub enum ClassItem { pub enum ClassItem {
Method(FunctionDecl), Method(FunctionDecl),
+19 -1
View File
@@ -259,6 +259,24 @@ impl_decl = {
"impl" ~ generics? ~ type_expr ~ "{" ~ method* ~ "}" "impl" ~ generics? ~ type_expr ~ "{" ~ method* ~ "}"
} }
// ======================================================
// Traits
// ======================================================
trait_requirements = { ":" ~ type_expr_param ~ ("+" ~ type_expr_param)* }
method_no_body = {
export? ~ type_expr ~ identifier ~ generics? ~ "(" ~ self_param? ~ ("," ~ param_list?)? ~ ")"
}
trait_item = _{
method
| method_no_body
}
trait_decl = {
export? ~ "trait" ~ identifier ~ generics? ~ trait_requirements? ~ "{" ~ trait_item* ~ "}"
}
// ====================================================== // ======================================================
// FUNCTIONS // FUNCTIONS
// ====================================================== // ======================================================
@@ -272,7 +290,7 @@ function_decl = {
// ====================================================== // ======================================================
top_level = { top_level = {
(attributes ~ (import | impl_for_decl | impl_decl | function_decl | struct_decl | enum_decl | class_decl | mod_package)) (attributes ~ (import | impl_for_decl | impl_decl | trait_decl | struct_decl | enum_decl | class_decl | mod_package | function_decl))
| mod_attribute | mod_attribute
} }
+25
View File
@@ -305,6 +305,31 @@ impl From<pest::iterators::Pair<'_, Rule>> for TopLevelKind {
Rule::impl_for_decl | Rule::impl_decl => TopLevelKind::ImplDecl(ImplDecl::from(pair)), Rule::impl_for_decl | Rule::impl_decl => TopLevelKind::ImplDecl(ImplDecl::from(pair)),
Rule::trait_decl => TopLevelKind::TraitDecl {
visibility: Visibility::from(&mut inner),
name: Identifier::from(inner.next().unwrap()),
generics: consume_rule(&mut inner, Rule::generics)
.map(Generics::from)
.unwrap_or_default(),
requirements: consume_rule(&mut inner, Rule::trait_requirements)
.map(|pair| pair.into_inner().map(TypeExpr::from).collect())
.unwrap_or_default(),
items: inner.map(TraitItem::from).collect(),
},
_ => unimplemented!("{rule:#?}"),
}
}
}
impl From<pest::iterators::Pair<'_, Rule>> for TraitItem {
fn from(pair: pest::iterators::Pair<'_, Rule>) -> Self {
let rule = pair.as_rule();
match rule {
Rule::method => TraitItem::WithBody(FunctionDecl::from(pair)),
Rule::method_no_body => TraitItem::NoBody(FunctionDecl::from(pair)),
_ => unimplemented!("{rule:#?}"), _ => unimplemented!("{rule:#?}"),
} }
} }