Skip to main content

rustidy_ast/ty/
bare_function.rs

1//! Array type
2
3// Imports
4use {
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/// `BareFunctionType`
20#[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/// `FunctionTypeQualifiers`
43#[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/// `FunctionParametersMaybeNamedVariadic`
53#[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/// `MaybeNamedFunctionParameters`
62#[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/// `MaybeNamedParam`
71#[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/// `MaybeNamedFunctionParametersVariadic`
106#[derive(PartialEq, Eq, Clone, Debug)]
107#[derive(serde::Serialize, serde::Deserialize)]
108#[derive(Parse, Formattable, Format, Print)]
109pub struct MaybeNamedFunctionParametersVariadic {
110	// TODO: `fn(...)` is accepted by the rust compiler, but
111	//       the reference demands at least 1 argument, should
112	//       we allow it?
113	#[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/// `BareFunctionReturnType`
123#[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}