Parse a struct declaration ```rs pub struct Point { x: i32, y: i32, } ```
(
&mut self,
visibility: Visibility,
)
| 19 | /// } |
| 20 | /// ``` |
| 21 | pub fn parse_struct_decl( |
| 22 | &mut self, |
| 23 | visibility: Visibility, |
| 24 | ) -> Result<Stmt<'a, 'bump>, DiagnosticError<'a>> { |
| 25 | let token = self.cursor.expect(TokenKind::Struct)?; |
| 26 | |
| 27 | let (name, _span) = self.cursor.expect_ident()?; |
| 28 | |
| 29 | // Parse optional generics: <T, U: Display> |
| 30 | let generics = if self.cursor.peek() == TokenKind::Lt { |
| 31 | self.parse_generics()? |
| 32 | } else { |
| 33 | None |
| 34 | }; |
| 35 | |
| 36 | let params = if self.cursor.consume(TokenKind::Semicolon) { |
| 37 | None |
| 38 | } else if self.cursor.peek() == TokenKind::LParen { |
| 39 | // Tuple struct: `struct Foo(i32, i32);` |
| 40 | let tuple_fields = self.parse_tuple_struct_fields()?; |
| 41 | self.cursor.expect(TokenKind::Semicolon)?; |
| 42 | Some(tuple_fields) |
| 43 | } else { |
| 44 | self.cursor.expect(TokenKind::LBrace)?; |
| 45 | |
| 46 | let mut fields = Vec::new(); |
| 47 | |
| 48 | while self.cursor.peek() != TokenKind::RBrace && self.cursor.peek() != TokenKind::EOF { |
| 49 | let field_vis = if self.cursor.peek() == TokenKind::Private |
| 50 | || self.cursor.peek() == TokenKind::Module |
| 51 | || self.cursor.peek() == TokenKind::Package |
| 52 | { |
| 53 | let vis = token_to_visibility(self.cursor.peek()); |
| 54 | self.cursor.advance(); |
| 55 | vis |
| 56 | } else { |
| 57 | Visibility::Public |
| 58 | }; |
| 59 | |
| 60 | let (field_name, field_span) = self.cursor.expect_ident()?; |
| 61 | self.cursor.expect(TokenKind::Colon)?; |
| 62 | let field_type = self.parse_type()?; |
| 63 | |
| 64 | fields.push(Field { |
| 65 | name: field_name, |
| 66 | field_type, |
| 67 | visibility: field_vis, |
| 68 | span: field_span, |
| 69 | }); |
| 70 | |
| 71 | self.cursor.consume(TokenKind::Comma); |
| 72 | } |
| 73 | |
| 74 | self.cursor.expect(TokenKind::RBrace)?; |
| 75 | |
| 76 | let fields_as_params: Vec<Param<'a, 'bump>> = fields |
| 77 | .into_iter() |
| 78 | .map(|f| { |
no test coverage detected