Make return special for block
This commit is contained in:
parent
dca604a038
commit
9d7a63f25b
@ -208,22 +208,23 @@ impl Parse for FunctionSignature {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Block(Vec<BlockLevelStatement>);
|
pub struct Block(Vec<BlockLevelStatement>, Option<Expression>);
|
||||||
|
|
||||||
impl Parse for Block {
|
impl Parse for Block {
|
||||||
fn parse(mut stream: TokenStream) -> Result<Self, ()> {
|
fn parse(mut stream: TokenStream) -> Result<Self, ()> {
|
||||||
let mut statements = Vec::new();
|
let mut statements = Vec::new();
|
||||||
|
let mut return_stmt = None;
|
||||||
stream.expect(Token::BraceOpen)?;
|
stream.expect(Token::BraceOpen)?;
|
||||||
while !matches!(stream.peek(), Some(Token::BraceClose)) {
|
while !matches!(stream.peek(), Some(Token::BraceClose)) {
|
||||||
let statement = stream.parse()?;
|
let statement = stream.parse()?;
|
||||||
if let BlockLevelStatement::Return(_) = &statement {
|
if let BlockLevelStatement::Return(e) = &statement {
|
||||||
statements.push(statement);
|
return_stmt = Some(e.clone());
|
||||||
break; // Return has to be the last statement
|
break; // Return has to be the last statement
|
||||||
}
|
}
|
||||||
statements.push(statement);
|
statements.push(statement);
|
||||||
}
|
}
|
||||||
stream.expect(Token::BraceClose)?;
|
stream.expect(Token::BraceClose)?;
|
||||||
Ok(Block(statements))
|
Ok(Block(statements, return_stmt))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user