Working soft return
This commit is contained in:
@@ -9,5 +9,9 @@ void main() {
|
||||
println!("Yes!");
|
||||
}
|
||||
|
||||
i32 y = if (x == 3) { 1 } else { 0 };
|
||||
|
||||
println!("hello, world {x}");
|
||||
|
||||
println!("{y}")
|
||||
}
|
||||
|
||||
@@ -3,7 +3,10 @@ use serde::Serialize;
|
||||
use super::*;
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Default)]
|
||||
pub struct Block(pub Vec<Spanned<Expression>>);
|
||||
pub struct Block(
|
||||
pub Vec<Spanned<Expression>>,
|
||||
pub Option<Spanned<Expression>>,
|
||||
);
|
||||
|
||||
#[derive(Debug, Clone, Serialize)]
|
||||
pub enum Statement {
|
||||
|
||||
@@ -339,7 +339,11 @@ top_level = {
|
||||
// ======================================================
|
||||
|
||||
block = {
|
||||
"{" ~ (statement | unexpected_statement)* ~ "}"
|
||||
"{" ~ statement_list ~ expr? ~ "}"
|
||||
}
|
||||
|
||||
statement_list = {
|
||||
(statement | (!expr ~ unexpected_statement))*
|
||||
}
|
||||
|
||||
statement = _{
|
||||
@@ -472,7 +476,8 @@ expr_path = {
|
||||
}
|
||||
|
||||
primary = {
|
||||
basic_stmt
|
||||
control_flow
|
||||
| basic_stmt
|
||||
| literal
|
||||
| expr_path
|
||||
| tuple
|
||||
|
||||
@@ -10,8 +10,10 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Block {
|
||||
type Error = AstError<'a, Self>;
|
||||
|
||||
fn try_from(pair: pest::iterators::Pair<'a, Rule>) -> Result<Self, Self::Error> {
|
||||
let mut inner = pair.clone().into_inner();
|
||||
|
||||
ast_ensure!(pair, Rule::block => {
|
||||
ast_expr!(Block(collect_recovered(pair.into_inner())))
|
||||
ast_expr!(Block(collect_recovered(inner.next().unwrap().into_inner()), inner.next().map(Spanned::try_from).transpose()))
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -39,7 +41,9 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Statement {
|
||||
let mut inner = pair.clone().into_inner();
|
||||
|
||||
match rule {
|
||||
Rule::statement | Rule::basic_stmt | Rule::control_flow => Statement::try_from(inner.next().unwrap()),
|
||||
Rule::statement | Rule::basic_stmt | Rule::control_flow => {
|
||||
Statement::try_from(inner.next().unwrap())
|
||||
}
|
||||
|
||||
Rule::block => ast_expr!(Statement::Block(pair.try_into())),
|
||||
|
||||
|
||||
@@ -326,6 +326,10 @@ impl ToRust for Block {
|
||||
for stmt in self.0 {
|
||||
cg.add_indentedln(&(stmt.get_rust() + ";"));
|
||||
}
|
||||
|
||||
if let Some(soft_return) = self.1 {
|
||||
cg.add_indentedln(&soft_return.get_rust());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user