typed_quote/tokens/
option.rs1use crate::Either;
2
3use super::*;
4
5impl<T: MaybeSpan> sealed::MaybeSpan for Option<T> {}
6impl<T: MaybeSpan> MaybeSpan for Option<T> {
7 #[cfg(feature = "proc-macro")]
8 fn into_span_or_call_site(self) -> proc_macro::Span {
9 self.map_or_else(proc_macro::Span::call_site, T::into_span_or_call_site)
10 }
11 #[cfg(feature = "proc-macro")]
12 fn make_punct(self, punct: proc_macro::Punct) -> proc_macro::Punct {
13 if let Some(span) = self {
14 span.make_punct(punct)
15 } else {
16 punct
17 }
18 }
19 #[cfg(feature = "proc-macro")]
20 fn make_group(self, g: proc_macro::Group) -> proc_macro::Group {
21 if let Some(span) = self {
22 span.make_group(g)
23 } else {
24 g
25 }
26 }
27 #[cfg(feature = "proc-macro")]
28 fn make_literal(self, literal: proc_macro::Literal) -> proc_macro::Literal {
29 if let Some(span) = self {
30 span.make_literal(literal)
31 } else {
32 literal
33 }
34 }
35
36 #[cfg(feature = "proc-macro2")]
37 fn into_span2_or_call_site(self) -> proc_macro2::Span {
38 self.map_or_else(proc_macro2::Span::call_site, T::into_span2_or_call_site)
39 }
40 #[cfg(feature = "proc-macro2")]
41 fn make_punct2(self, punct: proc_macro2::Punct) -> proc_macro2::Punct {
42 if let Some(span) = self {
43 span.make_punct2(punct)
44 } else {
45 punct
46 }
47 }
48 #[cfg(feature = "proc-macro2")]
49 fn make_group2(self, g: proc_macro2::Group) -> proc_macro2::Group {
50 if let Some(span) = self {
51 span.make_group2(g)
52 } else {
53 g
54 }
55 }
56 #[cfg(feature = "proc-macro2")]
57 fn make_literal2(self, literal: proc_macro2::Literal) -> proc_macro2::Literal {
58 if let Some(span) = self {
59 span.make_literal2(literal)
60 } else {
61 literal
62 }
63 }
64
65 type Span = T::Span;
66 fn try_into_span(self) -> Option<Self::Span> {
67 self.and_then(T::try_into_span)
68 }
69
70 type WithDefaultSpan<S: crate::Span> = Either<T::Span, S>;
71 fn with_default_span<S: crate::Span>(self, span: S) -> Self::WithDefaultSpan<S> {
72 self.try_into_span().map_or(Either::B(span), Either::A)
73 }
74
75 type WithReplacedSpan<S: crate::Span> = S;
76 fn with_replaced_span<S: crate::Span>(self, span: S) -> Self::WithReplacedSpan<S> {
77 span
78 }
79}
80
81impl<T: IntoTokens> sealed::IntoTokens for Option<T> {}
82impl<T: IntoTokens> IntoTokens for Option<T> {
83 crate::impl_into_tokens!(
84 |self, ts| if let Some(t) = self {
85 () = (t, ts).into_st()
86 },
87 self.map(IntoST::into_st).unwrap_or_default(),
88 );
89}
90
91impl<T: ToTokens> sealed::ToTokens for Option<T> {}
92impl<T: ToTokens> ToTokens for Option<T> {
93 crate::impl_to_tokens!(
94 |self, ts| if let Some(t) = self {
95 () = (t, ts).into_st()
96 },
97 self.as_ref().map(IntoST::into_st).unwrap_or_default(),
98 );
99}
100
101impl<T: WithSpan> sealed::WithSpan for Option<T> {}
102impl<T: WithSpan> WithSpan for Option<T> {
103 type WithDefaultSpan<S: crate::Span> = Option<T::WithDefaultSpan<S>>;
104
105 fn with_default_span<S: crate::Span>(self, span: S) -> Self::WithDefaultSpan<S> {
106 self.map(|t| t.with_default_span(span))
107 }
108
109 type WithReplacedSpan<S: crate::Span> = Option<T::WithReplacedSpan<S>>;
110
111 fn with_replaced_span<S: crate::Span>(self, span: S) -> Self::WithReplacedSpan<S> {
112 self.map(|t| t.with_replaced_span(span))
113 }
114}
115
116impl<T: RefWithSpan> sealed::RefWithSpan for Option<T> {}
117impl<T: RefWithSpan> RefWithSpan for Option<T> {
118 type RefWithDefaultSpan<'a, S: crate::Span>
119 = Option<T::RefWithDefaultSpan<'a, S>>
120 where
121 Self: 'a;
122
123 fn ref_with_default_span<S: crate::Span>(&self, span: S) -> Self::RefWithDefaultSpan<'_, S> {
124 self.as_ref().map(|t| t.ref_with_default_span(span))
125 }
126
127 type RefWithReplacedSpan<'a, S: crate::Span>
128 = Option<T::RefWithReplacedSpan<'a, S>>
129 where
130 Self: 'a;
131
132 fn ref_with_replaced_span<S: crate::Span>(&self, span: S) -> Self::RefWithReplacedSpan<'_, S> {
133 self.as_ref().map(|t| t.ref_with_replaced_span(span))
134 }
135}