Skip to main content

cxx_gen/syntax/
tokens.rs

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![:](name.rust.span()).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        // Notional token range for error reporting purposes.
177        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        // Notional token range for error reporting purposes.
186        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        // Notional token range for error reporting purposes.
195        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        // Notional token range for error reporting purposes.
204        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        // Notional token range for error reporting purposes.
213        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![->](paren_token.span.join()).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![->](paren_token.span.join()).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}