error system: decl

This commit is contained in:
2026-05-16 04:51:32 +02:00
parent e6bf1e0d2c
commit cbd060149d
+21 -27
View File
@@ -1,7 +1,8 @@
use crate::{ use crate::{
Rule, Rule,
ast::*, ast::*,
error::{AstError, IntoErr}, ast_expr,
error::{AstError, AstResult, IntoErr},
parser::listen_rule, parser::listen_rule,
}; };
@@ -13,11 +14,10 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for VarDeclStmt {
Rule::var_decl_statement => { Rule::var_decl_statement => {
let mut inner = pair.into_inner(); let mut inner = pair.into_inner();
let decl = VarDecl::try_from(inner.next().unwrap()).get()?; ast_expr!(VarDeclStmt {
decl: inner.next().unwrap().try_into(),
let init = inner.next().map(Expression::try_from).transpose().get()?; init: inner.next().map(Expression::try_from).transpose()
})
Ok(VarDeclStmt { decl, init })
} }
_ => unimplemented!(), _ => unimplemented!(),
@@ -33,11 +33,10 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for FieldDeclStmt {
Rule::class_field => { Rule::class_field => {
let mut inner = pair.into_inner(); let mut inner = pair.into_inner();
let decl = FieldDecl::try_from(inner.next().unwrap()).get()?; ast_expr!(FieldDeclStmt {
decl: inner.next().unwrap().try_into(),
let init = inner.next().map(Expression::try_from).transpose().get()?; init: inner.next().map(Expression::try_from).transpose(),
})
Ok(FieldDeclStmt { decl, init })
} }
_ => unimplemented!(), _ => unimplemented!(),
@@ -62,17 +61,16 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for VarDecl {
Some(TypeExpr::try_from(pair)) Some(TypeExpr::try_from(pair))
} }
}) })
.transpose() .transpose();
.get()?;
let mutable = listen_rule(&mut inner, Rule::mutable); let mutable: AstResult<'_, bool> = Ok(listen_rule(&mut inner, Rule::mutable));
let name = Pattern::try_from(inner.next().unwrap()).get()?; let name = Pattern::try_from(inner.next().unwrap());
Ok(VarDecl { ast_expr!(VarDecl {
mutable, type_: type_,
name, mutable: mutable,
type_, name: name,
}) })
} }
@@ -89,14 +87,10 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for FieldDecl {
Rule::field => { Rule::field => {
let mut inner = pair.into_inner(); let mut inner = pair.into_inner();
let visibility = Visibility::try_from(&mut inner).get()?; ast_expr!(FieldDecl {
let type_ = TypeExpr::try_from(inner.next().unwrap()).get()?; visibility: Visibility::try_from(&mut inner),
let name = Identifier::try_from(inner.next().unwrap()).get()?; type_: TypeExpr::try_from(inner.next().unwrap()),
name: Identifier::try_from(inner.next().unwrap()),
Ok(FieldDecl {
visibility,
type_,
name,
}) })
} }