Using & for refrences, and switched to type name

This commit is contained in:
2026-06-23 03:26:30 +02:00
parent b6ed825bf6
commit 2ae4ca510d
4 changed files with 37 additions and 23 deletions
+9 -8
View File
@@ -82,7 +82,7 @@ module_program = {
visibility = { "pub" ~ ("(" ~ static_path ~ ")")? } visibility = { "pub" ~ ("(" ~ static_path ~ ")")? }
mutable = { "mut" } mutable = { "mut" }
unsafe_kw = { "unsafe" } unsafe_kw = { "unsafe" }
// ====================================================== // ======================================================
// GENERICS // GENERICS
@@ -108,7 +108,7 @@ path_type = {
ref_lifetime = { lifetime | unsafe_kw } ref_lifetime = { lifetime | unsafe_kw }
ref_type = { ref_type = {
"*" ~ ref_lifetime? ~ mutable? ~ type_expr mutable? ~ ref_lifetime? ~ "&"
} }
dyn_type = { dyn_type = {
@@ -116,7 +116,7 @@ dyn_type = {
} }
type_expr = { type_expr = {
(path_type | tuple_type | ref_type | dyn_type) (path_type | tuple_type | dyn_type) ~ ref_type*
} }
lifetime = { lifetime = {
@@ -200,15 +200,16 @@ attributes = {
// DECLARATION HELPERS // DECLARATION HELPERS
// ====================================================== // ======================================================
var_decl = { var_decl = {
"let" ~ pattern ~ type_expr? ("let" | type_expr) ~ pattern
} }
field = { field = {
visibility? ~ identifier ~ type_expr visibility? ~ type_expr ~ identifier
} }
param = { param = {
pattern ~ type_expr? (type_expr ~ pattern)
| pattern
} }
field_list = { field_list = {
@@ -286,7 +287,7 @@ class_field = {
} }
self_param = { self_param = {
(deref_px ~ lifetime?)? ~ mutable? ~ "self" (ref_px ~ lifetime?)? ~ mutable? ~ "self"
} }
method_args = _{ method_args = _{
@@ -333,7 +334,7 @@ trait_decl = {
override_kw = { "override" ~ ("(" ~ expr_path ~ ")")? } override_kw = { "override" ~ ("(" ~ expr_path ~ ")")? }
function_decl = { function_decl = {
visibility? ~ "fn" ~ ("void" | type_expr) ~ identifier ~ generics_decl? ~ "(" ~ method_args ~ ")" ~ override_kw? ~ (block | semicolon) visibility? ~ ("void" | type_expr) ~ identifier ~ generics_decl? ~ "(" ~ method_args ~ ")" ~ override_kw? ~ (block | semicolon)
} }
// ====================================================== // ======================================================
+5 -2
View File
@@ -3,6 +3,7 @@ use crate::{
ast::*, ast::*,
ast_expr, ast_expr,
error::{AstError, IntoErr, collect_recovered}, error::{AstError, IntoErr, collect_recovered},
parser::consume_rule,
}; };
impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for VarDeclStmt { impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for VarDeclStmt {
@@ -52,8 +53,10 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for VarDecl {
let mut inner = pair.into_inner(); let mut inner = pair.into_inner();
ast_expr!(VarDecl { ast_expr!(VarDecl {
type_: consume_rule(&mut inner, Rule::type_expr)
.map(TypeExpr::try_from)
.transpose(),
name: Pattern::try_from(inner.next().unwrap()), name: Pattern::try_from(inner.next().unwrap()),
type_: inner.next().map(TypeExpr::try_from).transpose(),
}) })
} }
@@ -72,8 +75,8 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for FieldDecl {
ast_expr!(FieldDecl { ast_expr!(FieldDecl {
visibility: Visibility::try_from(&mut inner), visibility: Visibility::try_from(&mut inner),
name: Identifier::try_from(inner.next().unwrap()),
type_: TypeExpr::try_from(inner.next().unwrap()), type_: TypeExpr::try_from(inner.next().unwrap()),
name: Identifier::try_from(inner.next().unwrap()),
}) })
} }
+22 -12
View File
@@ -2,7 +2,7 @@ use crate::{
Rule, Rule,
ast::*, ast::*,
ast_ensure, ast_expr, ast_ensure, ast_expr,
error::{AstError, AstResult, IntoErr, collect_recovered}, error::{AstError, IntoErr, collect_recovered},
parser::{consume_rule, listen_rule}, parser::{consume_rule, listen_rule},
}; };
@@ -15,7 +15,27 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for TypeExpr {
match rule { match rule {
Rule::generic => Self::try_from(inner.next().unwrap()), Rule::generic => Self::try_from(inner.next().unwrap()),
Rule::type_expr => inner.next().unwrap().try_into(), Rule::type_expr => {
let mut inner = inner;
let mut ty = TypeExpr::try_from(inner.next().unwrap())?;
for ref_pair in inner {
let mut ref_inner = ref_pair.into_inner();
ty = TypeExpr::Ref {
lifetime: consume_rule(&mut ref_inner, Rule::ref_lifetime)
.map(|v| v.into_inner().next().map(Lifetime::try_from))
.unwrap_or_default()
.transpose()
.get()?,
mutable: listen_rule(&mut ref_inner, Rule::mutable),
ty: Box::new(ty),
};
}
Ok(ty)
}
Rule::lifetime => ast_expr!(TypeExpr::Lifetime(inner.next().unwrap().try_into())), Rule::lifetime => ast_expr!(TypeExpr::Lifetime(inner.next().unwrap().try_into())),
Rule::tuple_type => ast_expr!(TypeExpr::Tuple(collect_recovered(inner))), Rule::tuple_type => ast_expr!(TypeExpr::Tuple(collect_recovered(inner))),
@@ -26,16 +46,6 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for TypeExpr {
)) ))
} }
Rule::ref_type => {
ast_expr!(TypeExpr::Ref {
lifetime: consume_rule(&mut inner, Rule::ref_lifetime)
.map(|v| v.into_inner().next().map(Lifetime::try_from))
.unwrap_or_default()
.transpose(),
mutable: Ok(listen_rule(&mut inner, Rule::mutable)) as AstResult<bool>,
ty: TypeExpr::try_from(inner.next().unwrap()).map(Box::new),
})
}
Rule::dyn_type => { Rule::dyn_type => {
ast_expr!(TypeExpr::Dyn( ast_expr!(TypeExpr::Dyn(
TypeExpr::try_from(inner.next().unwrap()).map(Box::new), TypeExpr::try_from(inner.next().unwrap()).map(Box::new),
+1 -1
View File
@@ -27,7 +27,7 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for FunctionDecl {
let self_param = consume_rule(&mut inner, Rule::self_param).map(|param| { let self_param = consume_rule(&mut inner, Rule::self_param).map(|param| {
let mut param_inner = param.into_inner(); let mut param_inner = param.into_inner();
let is_ref = listen_rule(&mut param_inner, Rule::deref_px); let is_ref = listen_rule(&mut param_inner, Rule::ref_px);
let lifetime = consume_rule(&mut param_inner, Rule::lifetime); let lifetime = consume_rule(&mut param_inner, Rule::lifetime);
let mutable = listen_rule(&mut param_inner, Rule::mutable); let mutable = listen_rule(&mut param_inner, Rule::mutable);
let name = Pattern::Path(mutable && !is_ref, Path(vec![Identifier(String::from("self"))])); let name = Pattern::Path(mutable && !is_ref, Path(vec![Identifier(String::from("self"))]));