Skip to main content

rustidy_ast/item/
trait_.rs

1//! Trait statement
2
3// Imports
4use {
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/// `Trait`
22#[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	// Note: Nightly-only
29	#[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	// Note: Nightly-only
51	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/// `AssociatedItem`
84#[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}