arrow_parser/
parse_module.rs1use crate::ast::Module;
2use crate::ast::ModuleItem;
3use crate::ast::Node;
4use crate::error::SyntaxResult;
5use crate::parse::Parser;
6use crate::token::TokenType;
7
8impl<'a> Parser<'a> {
9 pub fn parse_module(&mut self) -> SyntaxResult<Module> {
10 let mut items = vec![];
11 while !self.consume_if(TokenType::EOF)?.is_match() {
12 if self.peek()?.typ == TokenType::KeywordImpl {
13 items.push(self.parse_module_impl()?);
14 self.require(TokenType::Semicolon)?;
15 } else {
16 let statement = self.parse_stmt(true)?;
17 items.push(self.new_module_item(statement.loc, ModuleItem::Statement { statement }));
18 };
19 }
20 Ok(Module { items })
21 }
22
23 pub fn parse_module_impl(&mut self) -> SyntaxResult<Node<ModuleItem>> {
24 let loc_start = self.require(TokenType::KeywordImpl)?.loc;
25 let (_, name) = self.require_identifier_as_string()?;
26 self.require(TokenType::BraceOpen)?;
27 let mut methods = vec![];
28 loop {
29 if self.peek()?.typ == TokenType::BraceClose {
30 break;
31 };
32 let (_, name) = self.require_identifier_as_string()?;
33 let closure = self.parse_expr_closure()?;
34 methods.push((name, closure));
35 self.require(TokenType::Semicolon)?;
36 }
37 let loc_end = self.require(TokenType::BraceClose)?.loc;
38 Ok(self.new_module_item(loc_start + loc_end, ModuleItem::Impl { name, methods }))
39 }
40}