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