Soft returning refactor
This commit is contained in:
@@ -84,9 +84,9 @@ pub enum Generic {
|
||||
}
|
||||
|
||||
impl Expression {
|
||||
pub fn is_block(&self) -> bool {
|
||||
pub fn is_soft_return(&self) -> bool {
|
||||
if let Expression::Statement(stmt) = self {
|
||||
stmt.is_block()
|
||||
stmt.is_soft_return()
|
||||
} else {
|
||||
false
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ pub struct Block(
|
||||
|
||||
#[derive(Debug, Clone, Serialize)]
|
||||
pub enum StatementBody {
|
||||
Statement(Box<Statement>),
|
||||
Statement(Expression),
|
||||
Expression(Expression),
|
||||
}
|
||||
|
||||
@@ -64,12 +64,12 @@ pub struct StatementBranch {
|
||||
}
|
||||
|
||||
impl Statement {
|
||||
pub fn is_block(&self) -> bool {
|
||||
pub fn is_soft_return(&self) -> bool {
|
||||
match self {
|
||||
Self::Block(_) | Self::Match(_, _) => true,
|
||||
Self::While(branch) => branch.body.is_block(),
|
||||
Self::While(branch) => branch.body.is_soft_return(),
|
||||
Self::For { body, .. } | Self::Loop(body) | Self::CStyleFor { body, .. } => {
|
||||
body.is_block()
|
||||
body.is_soft_return()
|
||||
}
|
||||
Self::If {
|
||||
initial,
|
||||
@@ -78,13 +78,13 @@ impl Statement {
|
||||
} => {
|
||||
else_branch
|
||||
.as_ref()
|
||||
.map(|v| v.is_block())
|
||||
.map(|v| v.is_soft_return())
|
||||
.unwrap_or_default()
|
||||
|| else_if
|
||||
.last()
|
||||
.map(|b| b.body.is_block())
|
||||
.map(|b| b.body.is_soft_return())
|
||||
.unwrap_or_default()
|
||||
|| initial.body.is_block()
|
||||
|| initial.body.is_soft_return()
|
||||
}
|
||||
_ => false,
|
||||
}
|
||||
@@ -92,10 +92,10 @@ impl Statement {
|
||||
}
|
||||
|
||||
impl StatementBody {
|
||||
pub fn is_block(&self) -> bool {
|
||||
pub fn is_soft_return(&self) -> bool {
|
||||
match self {
|
||||
Self::Expression(_) => false,
|
||||
_ => true,
|
||||
Self::Expression(_) => true,
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Expression {
|
||||
|
||||
fn try_from(pair: pest::iterators::Pair<'a, Rule>) -> Result<Self, Self::Error> {
|
||||
let rule = pair.as_rule();
|
||||
let inner = pair.clone().into_inner();
|
||||
let mut inner = pair.clone().into_inner();
|
||||
|
||||
match rule {
|
||||
Rule::expr => {
|
||||
@@ -79,6 +79,15 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Expression {
|
||||
Rule::static_path => ast_expr!(Expression::Path(pair.try_into())),
|
||||
Rule::literal => ast_expr!(Expression::Literal(pair.try_into())),
|
||||
Rule::expr_path => ast_expr!(Expression::Path(pair.try_into())),
|
||||
Rule::statement_wrapper => {
|
||||
let i = inner.next().unwrap();
|
||||
match i.as_rule() {
|
||||
Rule::expr => i.try_into(),
|
||||
_ => ast_expr!(Expression::Statement(
|
||||
i.try_into().get_map(Box::new).map(Box::new)
|
||||
)),
|
||||
}
|
||||
}
|
||||
Rule::statement | Rule::basic_stmt | Rule::control_flow => ast_expr!(
|
||||
Expression::Statement(pair.try_into().get_map(Box::new).map(Box::new))
|
||||
),
|
||||
|
||||
@@ -29,7 +29,7 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for StatementBody {
|
||||
|
||||
match i.as_rule() {
|
||||
Rule::expr => ast_expr!(StatementBody::Expression(i.try_into())),
|
||||
Rule::statement_wrapper => ast_expr!(StatementBody::Statement(i.try_into().map(Box::new).get_map(Box::new))),
|
||||
Rule::statement_wrapper => ast_expr!(StatementBody::Statement(i.try_into())),
|
||||
_ => AstError::bug_unimplemented(i),
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user