Add associated function parsing partially
This commit is contained in:
		
							parent
							
								
									b03adf0ab6
								
							
						
					
					
						commit
						bee31f4b92
					
				| @ -236,6 +236,7 @@ pub enum TopLevelStatement { | ||||
|     FunctionDefinition(FunctionDefinition), | ||||
|     TypeDefinition(TypeDefinition), | ||||
|     BinopDefinition(BinopDefinition), | ||||
|     AssociatedFunction(Type, Vec<FunctionDefinition>), | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
|  | ||||
| @ -874,7 +874,14 @@ impl Parse for TopLevelStatement { | ||||
|                     range, | ||||
|                 }) | ||||
|             } | ||||
|             Some(Token::Impl) => Stmt::BinopDefinition(stream.parse()?), | ||||
|             Some(Token::Impl) => match stream.peek2() { | ||||
|                 Some(Token::Binop) => Stmt::BinopDefinition(stream.parse()?), | ||||
|                 Some(_) => { | ||||
|                     let AssociatedFunctionBlock(ty, functions) = stream.parse::<AssociatedFunctionBlock>()?; | ||||
|                     Stmt::AssociatedFunction(ty, functions) | ||||
|                 } | ||||
|                 _ => Err(stream.expecting_err("binop or associated function block")?)?, | ||||
|             }, | ||||
|             _ => Err(stream.expecting_err("import or fn")?)?, | ||||
|         }) | ||||
|     } | ||||
| @ -917,3 +924,21 @@ impl Parse for BinopDefinition { | ||||
|         }) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| pub struct AssociatedFunctionBlock(Type, Vec<FunctionDefinition>); | ||||
| 
 | ||||
| impl Parse for AssociatedFunctionBlock { | ||||
|     fn parse(mut stream: TokenStream) -> Result<Self, Error> { | ||||
|         stream.expect(Token::Impl)?; | ||||
|         let ty = stream.parse::<Type>()?; | ||||
|         stream.expect(Token::BraceOpen)?; | ||||
|         let mut functions = Vec::new(); | ||||
|         while let Some(Token::FnKeyword) = stream.peek() { | ||||
|             functions.push(stream.parse()?); | ||||
|         } | ||||
| 
 | ||||
|         stream.expect(Token::BraceClose)?; | ||||
|         Ok(AssociatedFunctionBlock(ty, functions)) | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -120,6 +120,7 @@ impl ast::Module { | ||||
|                         exported: false, | ||||
|                     }); | ||||
|                 } | ||||
|                 AssociatedFunction(_, function_definition) => todo!(), | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user