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