Skip to main content

typed_quote/tokens/
option.rs

1use 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}