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