(&mut self)
| 397 | } |
| 398 | |
| 399 | fn parse_spec(&mut self) -> Result<Spec> { |
| 400 | let pos = self.pos(); |
| 401 | self.expect_lparen()?; // term with args: (spec (<term> <args>) (provide ...) ...) |
| 402 | let term = self.parse_ident()?; |
| 403 | let mut args = vec![]; |
| 404 | while !self.is_rparen() { |
| 405 | args.push(self.parse_ident()?); |
| 406 | } |
| 407 | self.expect_rparen()?; // end term with args |
| 408 | |
| 409 | self.expect_lparen()?; // provide |
| 410 | if !self.eat_sym_str("provide")? { |
| 411 | return Err(self.error( |
| 412 | pos, |
| 413 | "Invalid spec: expected (spec (<term> <args>) (provide ...) ...)".to_string(), |
| 414 | )); |
| 415 | }; |
| 416 | let mut provides = vec![]; |
| 417 | while !self.is_rparen() { |
| 418 | provides.push(self.parse_spec_expr()?); |
| 419 | } |
| 420 | self.expect_rparen()?; // end provide |
| 421 | |
| 422 | let requires = if self.is_lparen() { |
| 423 | self.expect_lparen()?; |
| 424 | if !self.eat_sym_str("require")? { |
| 425 | return Err(self.error( |
| 426 | pos, |
| 427 | "Invalid spec: expected (spec (<term> <args>) (provide ...) (require ...))" |
| 428 | .to_string(), |
| 429 | )); |
| 430 | } |
| 431 | let mut require = vec![]; |
| 432 | while !self.is_rparen() { |
| 433 | require.push(self.parse_spec_expr()?); |
| 434 | } |
| 435 | self.expect_rparen()?; // end provide |
| 436 | require |
| 437 | } else { |
| 438 | vec![] |
| 439 | }; |
| 440 | |
| 441 | Ok(Spec { |
| 442 | term, |
| 443 | args, |
| 444 | provides, |
| 445 | requires, |
| 446 | }) |
| 447 | } |
| 448 | |
| 449 | fn parse_spec_expr(&mut self) -> Result<SpecExpr> { |
| 450 | let pos = self.pos(); |
no test coverage detected