| 1 | use crate::algorithm::Printer; |
| 2 | use crate::fixup::FixupContext; |
| 3 | use crate::iter::IterDelimited; |
| 4 | use crate::path::PathKind; |
| 5 | use crate::INDENT; |
| 6 | use syn::{Field, Fields, FieldsUnnamed, Variant, VisRestricted, Visibility}; |
| 7 | |
| 8 | impl Printer { |
| 9 | pub fn variant(&mut self, variant: &Variant) { |
| 10 | self.outer_attrs(&variant.attrs); |
| 11 | self.ident(&variant.ident); |
| 12 | match &variant.fields { |
| 13 | Fields::Named(fields) => { |
| 14 | self.nbsp(); |
| 15 | self.word("{" ); |
| 16 | self.cbox(INDENT); |
| 17 | self.space(); |
| 18 | for field in fields.named.iter().delimited() { |
| 19 | self.field(&field); |
| 20 | self.trailing_comma_or_space(field.is_last); |
| 21 | } |
| 22 | self.offset(-INDENT); |
| 23 | self.end(); |
| 24 | self.word("}" ); |
| 25 | } |
| 26 | Fields::Unnamed(fields) => { |
| 27 | self.cbox(INDENT); |
| 28 | self.fields_unnamed(fields); |
| 29 | self.end(); |
| 30 | } |
| 31 | Fields::Unit => {} |
| 32 | } |
| 33 | if let Some((_eq_token, discriminant)) = &variant.discriminant { |
| 34 | self.word(" = " ); |
| 35 | self.expr(discriminant, FixupContext::NONE); |
| 36 | } |
| 37 | } |
| 38 | |
| 39 | pub fn fields_unnamed(&mut self, fields: &FieldsUnnamed) { |
| 40 | self.word("(" ); |
| 41 | self.zerobreak(); |
| 42 | for field in fields.unnamed.iter().delimited() { |
| 43 | self.field(&field); |
| 44 | self.trailing_comma(field.is_last); |
| 45 | } |
| 46 | self.offset(-INDENT); |
| 47 | self.word(")" ); |
| 48 | } |
| 49 | |
| 50 | pub fn field(&mut self, field: &Field) { |
| 51 | self.outer_attrs(&field.attrs); |
| 52 | self.visibility(&field.vis); |
| 53 | if let Some(ident) = &field.ident { |
| 54 | self.ident(ident); |
| 55 | self.word(": " ); |
| 56 | } |
| 57 | self.ty(&field.ty); |
| 58 | } |
| 59 | |
| 60 | pub fn visibility(&mut self, vis: &Visibility) { |
| 61 | match vis { |
| 62 | Visibility::Public(_) => self.word("pub " ), |
| 63 | Visibility::Restricted(vis) => self.vis_restricted(vis), |
| 64 | Visibility::Inherited => {} |
| 65 | } |
| 66 | } |
| 67 | |
| 68 | fn vis_restricted(&mut self, vis: &VisRestricted) { |
| 69 | self.word("pub(" ); |
| 70 | let omit_in = vis.path.get_ident().map_or(false, |ident| { |
| 71 | matches!(ident.to_string().as_str(), "self" | "super" | "crate" ) |
| 72 | }); |
| 73 | if !omit_in { |
| 74 | self.word("in " ); |
| 75 | } |
| 76 | self.path(&vis.path, PathKind::Simple); |
| 77 | self.word(") " ); |
| 78 | } |
| 79 | } |
| 80 | |