Parse structure declaration
(&mut self)
| 209 | |
| 210 | /// Parse structure declaration |
| 211 | fn parse_structure(&mut self) -> crate::Result<StructureDecl> { |
| 212 | let start = self.expect(TokenKind::Structure)?.span; |
| 213 | |
| 214 | let name = self.parse_ident()?; |
| 215 | let universe_params = self.parse_universe_params()?; |
| 216 | let params = self.parse_params()?; |
| 217 | |
| 218 | let extends = Vec::new(); // TODO: Parse extends |
| 219 | |
| 220 | self.expect(TokenKind::Where)?; |
| 221 | |
| 222 | let mut fields = Vec::new(); |
| 223 | while !self.is_eof() && !self.check(&TokenKind::RBrace) { |
| 224 | let field_name = self.parse_ident()?; |
| 225 | self.expect(TokenKind::Colon)?; |
| 226 | let field_type = Box::new(self.parse_expr()?); |
| 227 | |
| 228 | fields.push(Field { |
| 229 | span: field_name.span.to(field_type.span()), |
| 230 | name: field_name, |
| 231 | type_: field_type, |
| 232 | }); |
| 233 | |
| 234 | if !self.check(&TokenKind::Comma) { |
| 235 | break; |
| 236 | } |
| 237 | self.advance(); |
| 238 | } |
| 239 | |
| 240 | let end = if let Some(last) = fields.last() { |
| 241 | last.span |
| 242 | } else { |
| 243 | name.span |
| 244 | }; |
| 245 | |
| 246 | Ok(StructureDecl { |
| 247 | span: start.to(end), |
| 248 | name, |
| 249 | universe_params, |
| 250 | params, |
| 251 | extends, |
| 252 | fields, |
| 253 | }) |
| 254 | } |
| 255 | |
| 256 | /// Parse universe parameters: .{u v} |
| 257 | fn parse_universe_params(&mut self) -> crate::Result<Vec<Ident>> { |
no test coverage detected