1use crate::syntax::atom::Atom::*;
2use crate::syntax::{
3 Array, Atom, Derive, Enum, EnumRepr, ExternFn, ExternType, Impl, Lifetimes, NamedType, Ptr,
4 Ref, Signature, SliceRef, Struct, Ty1, Type, TypeAlias, Var,
5};
6use proc_macro2::{Ident, Span, TokenStream};
7use quote::{ToTokens, quote_spanned};
8use syn::{Token, token};
9
10impl ToTokens for Type {
11 fn to_tokens(&self, tokens: &mut TokenStream) {
12 match self {
13 Type::Ident(ident) => {
14 if ident.rust == Char {
15 let span = ident.rust.span();
16 tokens.extend({
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "cxx");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "core");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "ffi");
::quote::__private::push_colon2_spanned(&mut _s, _span);
_s
}quote_spanned!(span=> ::cxx::core::ffi::));
17 } else if ident.rust == CxxString {
18 let span = ident.rust.span();
19 tokens.extend({
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "cxx");
::quote::__private::push_colon2_spanned(&mut _s, _span);
_s
}quote_spanned!(span=> ::cxx::));
20 } else if ident.rust == RustString {
21 let span = ident.rust.span();
22 tokens.extend({
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "cxx");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "alloc");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "string");
::quote::__private::push_colon2_spanned(&mut _s, _span);
_s
}quote_spanned!(span=> ::cxx::alloc::string::));
23 }
24 ident.to_tokens(tokens);
25 }
26 Type::RustBox(ty)
27 | Type::UniquePtr(ty)
28 | Type::SharedPtr(ty)
29 | Type::WeakPtr(ty)
30 | Type::CxxVector(ty)
31 | Type::RustVec(ty) => ty.to_tokens(tokens),
32 Type::Ref(r) | Type::Str(r) => r.to_tokens(tokens),
33 Type::Ptr(p) => p.to_tokens(tokens),
34 Type::Array(a) => a.to_tokens(tokens),
35 Type::Fn(f) => f.to_tokens(tokens),
36 Type::Void(span) => tokens.extend({
let _span: ::quote::__private::Span =
::quote::__private::get_span(*span).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{ ::quote::__private::TokenStream::new() });
_s
}quote_spanned!(*span=> ())),
37 Type::SliceRef(r) => r.to_tokens(tokens),
38 }
39 }
40}
41
42impl ToTokens for Var {
43 fn to_tokens(&self, tokens: &mut TokenStream) {
44 let Var {
45 cfg: _,
46 doc: _,
47 attrs: _,
48 visibility: _,
49 name,
50 colon_token: _,
51 ty,
52 } = self;
53 name.rust.to_tokens(tokens);
54 ::syn::token::ColonToken).to_tokens(tokens);
55 ty.to_tokens(tokens);
56 }
57}
58
59impl ToTokens for Ty1 {
60 fn to_tokens(&self, tokens: &mut TokenStream) {
61 let Ty1 {
62 name,
63 langle,
64 inner,
65 rangle,
66 } = self;
67 let span = name.span();
68 match name.to_string().as_str() {
69 "UniquePtr" | "SharedPtr" | "WeakPtr" | "CxxVector" => {
70 tokens.extend({
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "cxx");
::quote::__private::push_colon2_spanned(&mut _s, _span);
_s
}quote_spanned!(span=> ::cxx::));
71 }
72 "Box" => {
73 tokens.extend({
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "cxx");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "alloc");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "boxed");
::quote::__private::push_colon2_spanned(&mut _s, _span);
_s
}quote_spanned!(span=> ::cxx::alloc::boxed::));
74 }
75 "Vec" => {
76 tokens.extend({
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "cxx");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "alloc");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "vec");
::quote::__private::push_colon2_spanned(&mut _s, _span);
_s
}quote_spanned!(span=> ::cxx::alloc::vec::));
77 }
78 _ => {}
79 }
80 name.to_tokens(tokens);
81 langle.to_tokens(tokens);
82 inner.to_tokens(tokens);
83 rangle.to_tokens(tokens);
84 }
85}
86
87impl ToTokens for Ref {
88 fn to_tokens(&self, tokens: &mut TokenStream) {
89 let Ref {
90 pinned: _,
91 ampersand,
92 lifetime,
93 mutable: _,
94 inner,
95 pin_tokens,
96 mutability,
97 } = self;
98 if let Some((pin, langle, _rangle)) = pin_tokens {
99 tokens.extend({
let _span: ::quote::__private::Span =
::quote::__private::get_span(pin.span).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "cxx");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "core");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "pin");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Pin");
_s
}quote_spanned!(pin.span=> ::cxx::core::pin::Pin));
100 langle.to_tokens(tokens);
101 }
102 ampersand.to_tokens(tokens);
103 lifetime.to_tokens(tokens);
104 mutability.to_tokens(tokens);
105 inner.to_tokens(tokens);
106 if let Some((_pin, _langle, rangle)) = pin_tokens {
107 rangle.to_tokens(tokens);
108 }
109 }
110}
111
112impl ToTokens for Ptr {
113 fn to_tokens(&self, tokens: &mut TokenStream) {
114 let Ptr {
115 star,
116 mutable: _,
117 inner,
118 mutability,
119 } = self;
120 star.to_tokens(tokens);
121 mutability.to_tokens(tokens);
122 inner.to_tokens(tokens);
123 }
124}
125
126impl ToTokens for SliceRef {
127 fn to_tokens(&self, tokens: &mut TokenStream) {
128 let SliceRef {
129 ampersand,
130 lifetime,
131 mutable: _,
132 bracket,
133 inner,
134 mutability,
135 } = self;
136 ampersand.to_tokens(tokens);
137 lifetime.to_tokens(tokens);
138 mutability.to_tokens(tokens);
139 bracket.surround(tokens, |tokens| {
140 inner.to_tokens(tokens);
141 });
142 }
143}
144
145impl ToTokens for Array {
146 fn to_tokens(&self, tokens: &mut TokenStream) {
147 let Array {
148 bracket,
149 inner,
150 semi_token,
151 len: _,
152 len_token,
153 } = self;
154 bracket.surround(tokens, |tokens| {
155 inner.to_tokens(tokens);
156 semi_token.to_tokens(tokens);
157 len_token.to_tokens(tokens);
158 });
159 }
160}
161
162impl ToTokens for Atom {
163 fn to_tokens(&self, tokens: &mut TokenStream) {
164 Ident::new(self.as_ref(), Span::call_site()).to_tokens(tokens);
165 }
166}
167
168impl ToTokens for Derive {
169 fn to_tokens(&self, tokens: &mut TokenStream) {
170 Ident::new(self.what.as_ref(), self.span).to_tokens(tokens);
171 }
172}
173
174impl ToTokens for ExternType {
175 fn to_tokens(&self, tokens: &mut TokenStream) {
176 self.type_token.to_tokens(tokens);
178 self.name.rust.to_tokens(tokens);
179 self.generics.to_tokens(tokens);
180 }
181}
182
183impl ToTokens for TypeAlias {
184 fn to_tokens(&self, tokens: &mut TokenStream) {
185 self.type_token.to_tokens(tokens);
187 self.name.rust.to_tokens(tokens);
188 self.generics.to_tokens(tokens);
189 }
190}
191
192impl ToTokens for Struct {
193 fn to_tokens(&self, tokens: &mut TokenStream) {
194 self.struct_token.to_tokens(tokens);
196 self.name.rust.to_tokens(tokens);
197 self.generics.to_tokens(tokens);
198 }
199}
200
201impl ToTokens for Enum {
202 fn to_tokens(&self, tokens: &mut TokenStream) {
203 self.enum_token.to_tokens(tokens);
205 self.name.rust.to_tokens(tokens);
206 self.generics.to_tokens(tokens);
207 }
208}
209
210impl ToTokens for ExternFn {
211 fn to_tokens(&self, tokens: &mut TokenStream) {
212 self.unsafety.to_tokens(tokens);
214 self.fn_token.to_tokens(tokens);
215 self.semi_token.to_tokens(tokens);
216 }
217}
218
219impl ToTokens for Impl {
220 fn to_tokens(&self, tokens: &mut TokenStream) {
221 let Impl {
222 cfg: _,
223 attrs: _,
224 impl_token,
225 impl_generics,
226 negative: _,
227 ty,
228 brace_token,
229 negative_token,
230 } = self;
231 impl_token.to_tokens(tokens);
232 impl_generics.to_tokens(tokens);
233 negative_token.to_tokens(tokens);
234 ty.to_tokens(tokens);
235 brace_token.surround(tokens, |_tokens| {});
236 }
237}
238
239impl ToTokens for Lifetimes {
240 fn to_tokens(&self, tokens: &mut TokenStream) {
241 let Lifetimes {
242 lt_token,
243 lifetimes,
244 gt_token,
245 } = self;
246 lt_token.to_tokens(tokens);
247 lifetimes.to_tokens(tokens);
248 gt_token.to_tokens(tokens);
249 }
250}
251
252impl ToTokens for Signature {
253 fn to_tokens(&self, tokens: &mut TokenStream) {
254 let Signature {
255 asyncness: _,
256 unsafety: _,
257 fn_token,
258 generics: _,
259 kind: _,
260 args,
261 ret,
262 throws: _,
263 paren_token,
264 throws_tokens,
265 } = self;
266 fn_token.to_tokens(tokens);
267 paren_token.surround(tokens, |tokens| {
268 args.to_tokens(tokens);
269 });
270 if let Some(ret) = ret {
271 ::syn::token::RArrowToken).to_tokens(tokens);
272 if let Some((result, langle, rangle)) = throws_tokens {
273 result.to_tokens(tokens);
274 langle.to_tokens(tokens);
275 ret.to_tokens(tokens);
276 rangle.to_tokens(tokens);
277 } else {
278 ret.to_tokens(tokens);
279 }
280 } else if let Some((result, langle, rangle)) = throws_tokens {
281 ::syn::token::RArrowToken).to_tokens(tokens);
282 result.to_tokens(tokens);
283 langle.to_tokens(tokens);
284 token::Paren(langle.span).surround(tokens, |_| ());
285 rangle.to_tokens(tokens);
286 }
287 }
288}
289
290impl ToTokens for EnumRepr {
291 fn to_tokens(&self, tokens: &mut TokenStream) {
292 let EnumRepr { atom, repr_type: _ } = self;
293 atom.to_tokens(tokens);
294 }
295}
296
297impl ToTokens for NamedType {
298 fn to_tokens(&self, tokens: &mut TokenStream) {
299 let NamedType { rust, generics } = self;
300 rust.to_tokens(tokens);
301 generics.to_tokens(tokens);
302 }
303}