arrow_parser/
parse_module.rs

1use 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}