(self)
| 324 | return Product(self._parse_fields(), self._parse_optional_attributes()) |
| 325 | |
| 326 | def _parse_fields(self): |
| 327 | fields = [] |
| 328 | self._match(TokenKind.LParen) |
| 329 | while self.cur_token.kind == TokenKind.TypeId: |
| 330 | typename = self._advance() |
| 331 | quantifiers = self._parse_optional_field_quantifier() |
| 332 | id = (self._advance() if self.cur_token.kind in self._id_kinds |
| 333 | else None) |
| 334 | fields.append(Field(typename, id, quantifiers=quantifiers)) |
| 335 | if self.cur_token.kind == TokenKind.RParen: |
| 336 | break |
| 337 | elif self.cur_token.kind == TokenKind.Comma: |
| 338 | self._advance() |
| 339 | self._match(TokenKind.RParen) |
| 340 | return fields |
| 341 | |
| 342 | def _parse_optional_fields(self): |
| 343 | if self.cur_token.kind == TokenKind.LParen: |
no test coverage detected