Parse function parameters
(&mut self)
| 273 | |
| 274 | /// Parse function parameters |
| 275 | fn parse_params(&mut self) -> crate::Result<Vec<Param>> { |
| 276 | let mut params = Vec::new(); |
| 277 | |
| 278 | while self.check(&TokenKind::LParen) || self.check(&TokenKind::LBrace) { |
| 279 | let implicit = self.check(&TokenKind::LBrace); |
| 280 | let start = self.current().span; |
| 281 | self.advance(); |
| 282 | |
| 283 | let mut names = vec![self.parse_ident()?]; |
| 284 | |
| 285 | // Multiple names: (x y z : T) |
| 286 | while !self.check(&TokenKind::Colon) && !self.is_eof() { |
| 287 | names.push(self.parse_ident()?); |
| 288 | } |
| 289 | |
| 290 | let type_ = if self.check(&TokenKind::Colon) { |
| 291 | self.advance(); |
| 292 | Some(Box::new(self.parse_expr()?)) |
| 293 | } else { |
| 294 | None |
| 295 | }; |
| 296 | |
| 297 | let end_token = if implicit { |
| 298 | TokenKind::RBrace |
| 299 | } else { |
| 300 | TokenKind::RParen |
| 301 | }; |
| 302 | |
| 303 | let end = self.expect(end_token)?.span; |
| 304 | |
| 305 | params.push(Param { |
| 306 | span: start.to(end), |
| 307 | names, |
| 308 | type_, |
| 309 | implicit, |
| 310 | }); |
| 311 | } |
| 312 | |
| 313 | Ok(params) |
| 314 | } |
| 315 | |
| 316 | /// Parse an expression |
| 317 | pub fn parse_expr(&mut self) -> crate::Result<Expr> { |
no test coverage detected