(&mut self)
| 773 | } |
| 774 | |
| 775 | fn parse_extern(&mut self) -> Result<Extern> { |
| 776 | let pos = self.pos(); |
| 777 | if self.eat_sym_str("constructor")? { |
| 778 | let term = self.parse_ident()?; |
| 779 | let func = self.parse_ident()?; |
| 780 | Ok(Extern::Constructor { term, func, pos }) |
| 781 | } else if self.eat_sym_str("extractor")? { |
| 782 | let infallible = self.eat_sym_str("infallible")?; |
| 783 | |
| 784 | let term = self.parse_ident()?; |
| 785 | let func = self.parse_ident()?; |
| 786 | |
| 787 | Ok(Extern::Extractor { |
| 788 | term, |
| 789 | func, |
| 790 | pos, |
| 791 | infallible, |
| 792 | }) |
| 793 | } else if self.eat_sym_str("const")? { |
| 794 | let pos = self.pos(); |
| 795 | let name = self.parse_const()?; |
| 796 | let ty = self.parse_ident()?; |
| 797 | Ok(Extern::Const { name, ty, pos }) |
| 798 | } else { |
| 799 | Err(self.error( |
| 800 | pos, |
| 801 | "Invalid extern: must be (extern constructor ...), (extern extractor ...) or (extern const ...)" |
| 802 | .to_string(), |
| 803 | )) |
| 804 | } |
| 805 | } |
| 806 | |
| 807 | fn parse_etor(&mut self) -> Result<Extractor> { |
| 808 | let pos = self.pos(); |
no test coverage detected