1use {
5 crate::{
6 attr::{self, WithOuterAttributes},
7 item::function::{ExternAbi, ForLifetimes},
8 token,
9 util::Parenthesized,
10 },
11 super::{Type, TypeNoBounds},
12 rustidy_ast_util::{Identifier, Punctuated, PunctuatedTrailing, delimited, punct},
13 rustidy_format::{Format, Formattable, WhitespaceFormat},
14 rustidy_parse::Parse,
15 rustidy_print::Print,
16 rustidy_util::Whitespace,
17};
18
19#[derive(PartialEq, Eq, Clone, Debug)]
21#[derive(serde::Serialize, serde::Deserialize)]
22#[derive(Parse, Formattable, Format, Print)]
23pub struct BareFunctionType {
24 pub for_lifetimes: Option<ForLifetimes>,
25 #[format(prefix_ws(expr = Whitespace::SINGLE, if_ = self.for_lifetimes.is_some()))]
26 pub qualifiers: Option<FunctionTypeQualifiers>,
27 #[format(prefix_ws(
28 expr = Whitespace::SINGLE,
29 if_ = self.for_lifetimes.is_some() || self.qualifiers.as_ref().is_some_and(
30 |qualifiers| qualifiers.unsafe_.is_some() || qualifiers.extern_.is_some()
31 )
32 ))]
33 pub fn_: token::Fn,
34 #[parse(fatal)]
35 #[format(prefix_ws = Whitespace::REMOVE)]
36 #[format(args = delimited::FmtRemove)]
37 pub params: Parenthesized<Option<FunctionParametersMaybeNamedVariadic>>,
38 #[format(prefix_ws = Whitespace::SINGLE)]
39 pub ret: Option<BareFunctionReturnType>,
40}
41
42#[derive(PartialEq, Eq, Clone, Debug)]
44#[derive(serde::Serialize, serde::Deserialize)]
45#[derive(Parse, Formattable, Format, Print)]
46pub struct FunctionTypeQualifiers {
47 pub unsafe_: Option<token::Unsafe>,
48 #[format(prefix_ws(expr = Whitespace::SINGLE, if_ = self.unsafe_.is_some()))]
49 pub extern_: Option<ExternAbi>,
50}
51
52#[derive(PartialEq, Eq, Clone, Debug)]
54#[derive(serde::Serialize, serde::Deserialize)]
55#[derive(Parse, Formattable, Format, Print)]
56pub enum FunctionParametersMaybeNamedVariadic {
57 Variadic(MaybeNamedFunctionParametersVariadic),
58 Normal(MaybeNamedFunctionParameters),
59}
60
61#[derive(PartialEq, Eq, Clone, Debug)]
63#[derive(serde::Serialize, serde::Deserialize)]
64#[derive(Parse, Formattable, Format, Print)]
65pub struct MaybeNamedFunctionParameters(
66 #[format(args = punct::fmt(Whitespace::SINGLE, Whitespace::REMOVE))]
67 PunctuatedTrailing<MaybeNamedParam, token::Comma>,
68);
69
70#[derive(PartialEq, Eq, Clone, Debug)]
72#[derive(serde::Serialize, serde::Deserialize)]
73#[derive(Parse, Formattable, Format, Print)]
74pub struct MaybeNamedParam(
75 #[format(args = attr::with::fmt(Whitespace::SINGLE))]
76 pub WithOuterAttributes<MaybeNamedParamInner>,
77);
78
79#[derive(PartialEq, Eq, Clone, Debug)]
80#[derive(serde::Serialize, serde::Deserialize)]
81#[derive(Parse, Formattable, Format, Print)]
82pub struct MaybeNamedParamInner {
83 pub name: Option<MaybeNamedParamInnerName>,
84 #[format(prefix_ws(expr = Whitespace::SINGLE, if_ = self.name.is_some()))]
85 pub ty: Box<Type>,
86}
87
88#[derive(PartialEq, Eq, Clone, Debug)]
89#[derive(serde::Serialize, serde::Deserialize)]
90#[derive(Parse, Formattable, Format, Print)]
91pub struct MaybeNamedParamInnerName {
92 pub inner: MaybeNamedParamInnerNameInner,
93 #[format(prefix_ws = Whitespace::REMOVE)]
94 pub colon: token::Colon,
95}
96
97#[derive(PartialEq, Eq, Clone, Debug)]
98#[derive(serde::Serialize, serde::Deserialize)]
99#[derive(Parse, Formattable, Format, Print)]
100pub enum MaybeNamedParamInnerNameInner {
101 Ident(Identifier),
102 Underscore(token::Underscore),
103}
104
105#[derive(PartialEq, Eq, Clone, Debug)]
107#[derive(serde::Serialize, serde::Deserialize)]
108#[derive(Parse, Formattable, Format, Print)]
109pub struct MaybeNamedFunctionParametersVariadic {
110 #[format(args = punct::fmt(Whitespace::SINGLE, Whitespace::REMOVE))]
114 pub params: Punctuated<MaybeNamedParam, token::Comma>,
115 #[format(prefix_ws = Whitespace::REMOVE)]
116 pub comma: token::Comma,
117 #[format(prefix_ws = Whitespace::SINGLE)]
118 #[format(args = attr::with::fmt(Whitespace::SINGLE))]
119 pub variadic: WithOuterAttributes<token::DotDotDot>,
120}
121
122#[derive(PartialEq, Eq, Clone, Debug)]
124#[derive(serde::Serialize, serde::Deserialize)]
125#[derive(Parse, Formattable, Format, Print)]
126pub struct BareFunctionReturnType {
127 pub arrow: token::RArrow,
128 #[format(prefix_ws = Whitespace::SINGLE)]
129 pub ty: Box<TypeNoBounds>,
130}