(self)
| 212 | ) |
| 213 | |
| 214 | def parse_message(self) -> ProtoMessage: |
| 215 | start = self.current() |
| 216 | self.consume(TokenType.MESSAGE, "Expected 'message'") |
| 217 | name = self.consume(TokenType.IDENT, "Expected message name").value |
| 218 | self.consume(TokenType.LBRACE, "Expected '{' after message name") |
| 219 | |
| 220 | fields: List[ProtoField] = [] |
| 221 | nested_messages: List[ProtoMessage] = [] |
| 222 | nested_enums: List[ProtoEnum] = [] |
| 223 | oneofs = [] |
| 224 | options = {} |
| 225 | |
| 226 | while not self.check(TokenType.RBRACE): |
| 227 | if self.check(TokenType.OPTION): |
| 228 | opt_name, opt_value = self.parse_option_statement() |
| 229 | options[opt_name] = opt_value |
| 230 | elif self.check(TokenType.MESSAGE): |
| 231 | nested_messages.append(self.parse_message()) |
| 232 | elif self.check(TokenType.ENUM): |
| 233 | nested_enums.append(self.parse_enum()) |
| 234 | elif self.check(TokenType.RESERVED): |
| 235 | self.parse_reserved() |
| 236 | elif self.check(TokenType.EXTENSIONS): |
| 237 | self.parse_extensions() |
| 238 | elif self.check(TokenType.ONEOF): |
| 239 | oneofs.append(self.parse_oneof()) |
| 240 | elif self.check(TokenType.SEMI): |
| 241 | self.advance() |
| 242 | else: |
| 243 | fields.append(self.parse_field()) |
| 244 | |
| 245 | self.consume(TokenType.RBRACE, "Expected '}' after message") |
| 246 | return ProtoMessage( |
| 247 | name=name, |
| 248 | fields=fields, |
| 249 | nested_messages=nested_messages, |
| 250 | nested_enums=nested_enums, |
| 251 | oneofs=oneofs, |
| 252 | options=options, |
| 253 | line=start.line, |
| 254 | column=start.column, |
| 255 | ) |
| 256 | |
| 257 | def parse_oneof(self) -> ProtoOneof: |
| 258 | start = self.current() |
no test coverage detected