1use {
5 crate::{attr::{self, BracedWithInnerAttributes, WithOuterAttributes}, token},
6 super::{
7 ConstantItem,
8 Function,
9 MacroInvocationSemi,
10 TypeAlias,
11 Visibility,
12 function::{GenericParams, TypeParamBounds, WhereClause},
13 },
14 rustidy_ast_util::Identifier,
15 rustidy_format::{Format, Formattable, WhitespaceFormat},
16 rustidy_parse::Parse,
17 rustidy_print::Print,
18 rustidy_util::Whitespace,
19};
20
21#[derive(PartialEq, Eq, Clone, Debug)]
23#[derive(serde::Serialize, serde::Deserialize)]
24#[derive(Parse, Formattable, Format, Print)]
25#[parse(name = "a trait")]
26pub struct Trait {
27 pub unsafe_: Option<token::Unsafe>,
28 #[format(prefix_ws(expr = Whitespace::SINGLE, if_ = self.unsafe_.is_some()))]
30 pub auto: Option<token::Auto>,
31 #[format(prefix_ws(expr = Whitespace::SINGLE, if_ = self.unsafe_.is_some() || self.auto.is_some()))]
32 pub trait_: token::Trait,
33 #[parse(fatal)]
34 #[format(prefix_ws = Whitespace::SINGLE)]
35 pub ident: Identifier,
36 #[format(prefix_ws = Whitespace::REMOVE)]
37 pub generics: Option<GenericParams>,
38 #[format(prefix_ws = Whitespace::REMOVE)]
39 pub bounds: Option<TraitColonBounds>,
40 #[format(prefix_ws = Whitespace::INDENT)]
41 pub where_: Option<WhereClause>,
42 #[format(prefix_ws = Whitespace::SINGLE)]
43 pub body: TraitBody,
44}
45
46#[derive(PartialEq, Eq, Clone, Debug)]
47#[derive(serde::Serialize, serde::Deserialize)]
48#[derive(Parse, Formattable, Format, Print)]
49pub enum TraitBody {
50 Eq(TraitBodyEq),
52 Full(BracedWithInnerAttributes<TraitBodyFull>),
53}
54
55#[derive(PartialEq, Eq, Clone, Debug)]
56#[derive(serde::Serialize, serde::Deserialize)]
57#[derive(Parse, Formattable, Format, Print)]
58pub struct TraitBodyEq {
59 pub eq: token::Eq,
60 #[format(prefix_ws = Whitespace::SINGLE)]
61 pub bounds: Option<TypeParamBounds>,
62 #[format(prefix_ws = Whitespace::REMOVE)]
63 pub semi: token::Semi,
64}
65
66#[derive(PartialEq, Eq, Clone, Debug)]
67#[derive(serde::Serialize, serde::Deserialize)]
68#[derive(Parse, Formattable, Format, Print)]
69pub struct TraitBodyFull(
70 #[format(args = rustidy_format::vec::args_prefix_ws(Whitespace::INDENT))]
71 pub Vec<AssociatedItem>,
72);
73
74#[derive(PartialEq, Eq, Clone, Debug)]
75#[derive(serde::Serialize, serde::Deserialize)]
76#[derive(Parse, Formattable, Format, Print)]
77pub struct TraitColonBounds {
78 pub colon: token::Colon,
79 #[format(prefix_ws = Whitespace::SINGLE)]
80 pub bounds: Option<TypeParamBounds>,
81}
82
83#[derive(PartialEq, Eq, Clone, Debug)]
85#[derive(serde::Serialize, serde::Deserialize)]
86#[derive(Parse, Formattable, Format, Print)]
87pub struct AssociatedItem(
88 #[format(args = attr::with::fmt(Whitespace::INDENT))]
89 pub WithOuterAttributes<AssociatedItemInner>,
90);
91
92#[derive(PartialEq, Eq, Clone, Debug)]
93#[derive(serde::Serialize, serde::Deserialize)]
94#[derive(Parse, Formattable, Format, Print)]
95pub enum AssociatedItemInner {
96 Macro(MacroInvocationSemi),
97 Vis(AssociatedItemVis),
98}
99
100#[derive(PartialEq, Eq, Clone, Debug)]
101#[derive(serde::Serialize, serde::Deserialize)]
102#[derive(Parse, Formattable, Format, Print)]
103pub struct AssociatedItemVis {
104 pub vis: Option<Visibility>,
105 #[format(prefix_ws(expr = Whitespace::SINGLE, if_ = self.vis.is_some()))]
106 pub inner: AssociatedItemVisInner,
107}
108
109#[derive(PartialEq, Eq, Clone, Debug)]
110#[derive(serde::Serialize, serde::Deserialize)]
111#[derive(Parse, Formattable, Format, Print)]
112pub enum AssociatedItemVisInner {
113 TypeAlias(TypeAlias),
114 Constant(ConstantItem),
115 Function(Function),
116}