133d722a9Sopenharmony_ciuse crate::syntax::atom::Atom::*;
233d722a9Sopenharmony_ciuse crate::syntax::{
333d722a9Sopenharmony_ci    Array, Atom, Derive, Enum, EnumRepr, ExternFn, ExternType, Impl, Lifetimes, NamedType, Ptr,
433d722a9Sopenharmony_ci    Ref, Signature, SliceRef, Struct, Ty1, Type, TypeAlias, Var,
533d722a9Sopenharmony_ci};
633d722a9Sopenharmony_ciuse proc_macro2::{Ident, Span, TokenStream};
733d722a9Sopenharmony_ciuse quote::{quote_spanned, ToTokens};
833d722a9Sopenharmony_ciuse syn::{token, Token};
933d722a9Sopenharmony_ci
1033d722a9Sopenharmony_ciimpl ToTokens for Type {
1133d722a9Sopenharmony_ci    fn to_tokens(&self, tokens: &mut TokenStream) {
1233d722a9Sopenharmony_ci        match self {
1333d722a9Sopenharmony_ci            Type::Ident(ident) => {
1433d722a9Sopenharmony_ci                if ident.rust == Char {
1533d722a9Sopenharmony_ci                    let span = ident.rust.span();
1633d722a9Sopenharmony_ci                    tokens.extend(quote_spanned!(span=> ::cxx::private::));
1733d722a9Sopenharmony_ci                } else if ident.rust == CxxString {
1833d722a9Sopenharmony_ci                    let span = ident.rust.span();
1933d722a9Sopenharmony_ci                    tokens.extend(quote_spanned!(span=> ::cxx::));
2033d722a9Sopenharmony_ci                } else if ident.rust == RustString {
2133d722a9Sopenharmony_ci                    let span = ident.rust.span();
2233d722a9Sopenharmony_ci                    tokens.extend(quote_spanned!(span=> ::cxx::alloc::string::));
2333d722a9Sopenharmony_ci                }
2433d722a9Sopenharmony_ci                ident.to_tokens(tokens);
2533d722a9Sopenharmony_ci            }
2633d722a9Sopenharmony_ci            Type::RustBox(ty)
2733d722a9Sopenharmony_ci            | Type::UniquePtr(ty)
2833d722a9Sopenharmony_ci            | Type::SharedPtr(ty)
2933d722a9Sopenharmony_ci            | Type::WeakPtr(ty)
3033d722a9Sopenharmony_ci            | Type::CxxVector(ty)
3133d722a9Sopenharmony_ci            | Type::RustVec(ty) => ty.to_tokens(tokens),
3233d722a9Sopenharmony_ci            Type::Ref(r) | Type::Str(r) => r.to_tokens(tokens),
3333d722a9Sopenharmony_ci            Type::Ptr(p) => p.to_tokens(tokens),
3433d722a9Sopenharmony_ci            Type::Array(a) => a.to_tokens(tokens),
3533d722a9Sopenharmony_ci            Type::Fn(f) => f.to_tokens(tokens),
3633d722a9Sopenharmony_ci            Type::Void(span) => tokens.extend(quote_spanned!(*span=> ())),
3733d722a9Sopenharmony_ci            Type::SliceRef(r) => r.to_tokens(tokens),
3833d722a9Sopenharmony_ci        }
3933d722a9Sopenharmony_ci    }
4033d722a9Sopenharmony_ci}
4133d722a9Sopenharmony_ci
4233d722a9Sopenharmony_ciimpl ToTokens for Var {
4333d722a9Sopenharmony_ci    fn to_tokens(&self, tokens: &mut TokenStream) {
4433d722a9Sopenharmony_ci        let Var {
4533d722a9Sopenharmony_ci            cfg: _,
4633d722a9Sopenharmony_ci            doc: _,
4733d722a9Sopenharmony_ci            attrs: _,
4833d722a9Sopenharmony_ci            visibility: _,
4933d722a9Sopenharmony_ci            name,
5033d722a9Sopenharmony_ci            colon_token: _,
5133d722a9Sopenharmony_ci            ty,
5233d722a9Sopenharmony_ci        } = self;
5333d722a9Sopenharmony_ci        name.rust.to_tokens(tokens);
5433d722a9Sopenharmony_ci        Token![:](name.rust.span()).to_tokens(tokens);
5533d722a9Sopenharmony_ci        ty.to_tokens(tokens);
5633d722a9Sopenharmony_ci    }
5733d722a9Sopenharmony_ci}
5833d722a9Sopenharmony_ci
5933d722a9Sopenharmony_ciimpl ToTokens for Ty1 {
6033d722a9Sopenharmony_ci    fn to_tokens(&self, tokens: &mut TokenStream) {
6133d722a9Sopenharmony_ci        let Ty1 {
6233d722a9Sopenharmony_ci            name,
6333d722a9Sopenharmony_ci            langle,
6433d722a9Sopenharmony_ci            inner,
6533d722a9Sopenharmony_ci            rangle,
6633d722a9Sopenharmony_ci        } = self;
6733d722a9Sopenharmony_ci        let span = name.span();
6833d722a9Sopenharmony_ci        match name.to_string().as_str() {
6933d722a9Sopenharmony_ci            "UniquePtr" | "SharedPtr" | "WeakPtr" | "CxxVector" => {
7033d722a9Sopenharmony_ci                tokens.extend(quote_spanned!(span=> ::cxx::));
7133d722a9Sopenharmony_ci            }
7233d722a9Sopenharmony_ci            "Box" => {
7333d722a9Sopenharmony_ci                tokens.extend(quote_spanned!(span=> ::cxx::alloc::boxed::));
7433d722a9Sopenharmony_ci            }
7533d722a9Sopenharmony_ci            "Vec" => {
7633d722a9Sopenharmony_ci                tokens.extend(quote_spanned!(span=> ::cxx::alloc::vec::));
7733d722a9Sopenharmony_ci            }
7833d722a9Sopenharmony_ci            _ => {}
7933d722a9Sopenharmony_ci        }
8033d722a9Sopenharmony_ci        name.to_tokens(tokens);
8133d722a9Sopenharmony_ci        langle.to_tokens(tokens);
8233d722a9Sopenharmony_ci        inner.to_tokens(tokens);
8333d722a9Sopenharmony_ci        rangle.to_tokens(tokens);
8433d722a9Sopenharmony_ci    }
8533d722a9Sopenharmony_ci}
8633d722a9Sopenharmony_ci
8733d722a9Sopenharmony_ciimpl ToTokens for Ref {
8833d722a9Sopenharmony_ci    fn to_tokens(&self, tokens: &mut TokenStream) {
8933d722a9Sopenharmony_ci        let Ref {
9033d722a9Sopenharmony_ci            pinned: _,
9133d722a9Sopenharmony_ci            ampersand,
9233d722a9Sopenharmony_ci            lifetime,
9333d722a9Sopenharmony_ci            mutable: _,
9433d722a9Sopenharmony_ci            inner,
9533d722a9Sopenharmony_ci            pin_tokens,
9633d722a9Sopenharmony_ci            mutability,
9733d722a9Sopenharmony_ci        } = self;
9833d722a9Sopenharmony_ci        if let Some((pin, langle, _rangle)) = pin_tokens {
9933d722a9Sopenharmony_ci            tokens.extend(quote_spanned!(pin.span=> ::cxx::core::pin::Pin));
10033d722a9Sopenharmony_ci            langle.to_tokens(tokens);
10133d722a9Sopenharmony_ci        }
10233d722a9Sopenharmony_ci        ampersand.to_tokens(tokens);
10333d722a9Sopenharmony_ci        lifetime.to_tokens(tokens);
10433d722a9Sopenharmony_ci        mutability.to_tokens(tokens);
10533d722a9Sopenharmony_ci        inner.to_tokens(tokens);
10633d722a9Sopenharmony_ci        if let Some((_pin, _langle, rangle)) = pin_tokens {
10733d722a9Sopenharmony_ci            rangle.to_tokens(tokens);
10833d722a9Sopenharmony_ci        }
10933d722a9Sopenharmony_ci    }
11033d722a9Sopenharmony_ci}
11133d722a9Sopenharmony_ci
11233d722a9Sopenharmony_ciimpl ToTokens for Ptr {
11333d722a9Sopenharmony_ci    fn to_tokens(&self, tokens: &mut TokenStream) {
11433d722a9Sopenharmony_ci        let Ptr {
11533d722a9Sopenharmony_ci            star,
11633d722a9Sopenharmony_ci            mutable: _,
11733d722a9Sopenharmony_ci            inner,
11833d722a9Sopenharmony_ci            mutability,
11933d722a9Sopenharmony_ci            constness,
12033d722a9Sopenharmony_ci        } = self;
12133d722a9Sopenharmony_ci        star.to_tokens(tokens);
12233d722a9Sopenharmony_ci        mutability.to_tokens(tokens);
12333d722a9Sopenharmony_ci        constness.to_tokens(tokens);
12433d722a9Sopenharmony_ci        inner.to_tokens(tokens);
12533d722a9Sopenharmony_ci    }
12633d722a9Sopenharmony_ci}
12733d722a9Sopenharmony_ci
12833d722a9Sopenharmony_ciimpl ToTokens for SliceRef {
12933d722a9Sopenharmony_ci    fn to_tokens(&self, tokens: &mut TokenStream) {
13033d722a9Sopenharmony_ci        let SliceRef {
13133d722a9Sopenharmony_ci            ampersand,
13233d722a9Sopenharmony_ci            lifetime,
13333d722a9Sopenharmony_ci            mutable: _,
13433d722a9Sopenharmony_ci            bracket,
13533d722a9Sopenharmony_ci            inner,
13633d722a9Sopenharmony_ci            mutability,
13733d722a9Sopenharmony_ci        } = self;
13833d722a9Sopenharmony_ci        ampersand.to_tokens(tokens);
13933d722a9Sopenharmony_ci        lifetime.to_tokens(tokens);
14033d722a9Sopenharmony_ci        mutability.to_tokens(tokens);
14133d722a9Sopenharmony_ci        bracket.surround(tokens, |tokens| {
14233d722a9Sopenharmony_ci            inner.to_tokens(tokens);
14333d722a9Sopenharmony_ci        });
14433d722a9Sopenharmony_ci    }
14533d722a9Sopenharmony_ci}
14633d722a9Sopenharmony_ci
14733d722a9Sopenharmony_ciimpl ToTokens for Array {
14833d722a9Sopenharmony_ci    fn to_tokens(&self, tokens: &mut TokenStream) {
14933d722a9Sopenharmony_ci        let Array {
15033d722a9Sopenharmony_ci            bracket,
15133d722a9Sopenharmony_ci            inner,
15233d722a9Sopenharmony_ci            semi_token,
15333d722a9Sopenharmony_ci            len: _,
15433d722a9Sopenharmony_ci            len_token,
15533d722a9Sopenharmony_ci        } = self;
15633d722a9Sopenharmony_ci        bracket.surround(tokens, |tokens| {
15733d722a9Sopenharmony_ci            inner.to_tokens(tokens);
15833d722a9Sopenharmony_ci            semi_token.to_tokens(tokens);
15933d722a9Sopenharmony_ci            len_token.to_tokens(tokens);
16033d722a9Sopenharmony_ci        });
16133d722a9Sopenharmony_ci    }
16233d722a9Sopenharmony_ci}
16333d722a9Sopenharmony_ci
16433d722a9Sopenharmony_ciimpl ToTokens for Atom {
16533d722a9Sopenharmony_ci    fn to_tokens(&self, tokens: &mut TokenStream) {
16633d722a9Sopenharmony_ci        Ident::new(self.as_ref(), Span::call_site()).to_tokens(tokens);
16733d722a9Sopenharmony_ci    }
16833d722a9Sopenharmony_ci}
16933d722a9Sopenharmony_ci
17033d722a9Sopenharmony_ciimpl ToTokens for Derive {
17133d722a9Sopenharmony_ci    fn to_tokens(&self, tokens: &mut TokenStream) {
17233d722a9Sopenharmony_ci        Ident::new(self.what.as_ref(), self.span).to_tokens(tokens);
17333d722a9Sopenharmony_ci    }
17433d722a9Sopenharmony_ci}
17533d722a9Sopenharmony_ci
17633d722a9Sopenharmony_ciimpl ToTokens for ExternType {
17733d722a9Sopenharmony_ci    fn to_tokens(&self, tokens: &mut TokenStream) {
17833d722a9Sopenharmony_ci        // Notional token range for error reporting purposes.
17933d722a9Sopenharmony_ci        self.type_token.to_tokens(tokens);
18033d722a9Sopenharmony_ci        self.name.rust.to_tokens(tokens);
18133d722a9Sopenharmony_ci        self.generics.to_tokens(tokens);
18233d722a9Sopenharmony_ci    }
18333d722a9Sopenharmony_ci}
18433d722a9Sopenharmony_ci
18533d722a9Sopenharmony_ciimpl ToTokens for TypeAlias {
18633d722a9Sopenharmony_ci    fn to_tokens(&self, tokens: &mut TokenStream) {
18733d722a9Sopenharmony_ci        // Notional token range for error reporting purposes.
18833d722a9Sopenharmony_ci        self.type_token.to_tokens(tokens);
18933d722a9Sopenharmony_ci        self.name.rust.to_tokens(tokens);
19033d722a9Sopenharmony_ci        self.generics.to_tokens(tokens);
19133d722a9Sopenharmony_ci    }
19233d722a9Sopenharmony_ci}
19333d722a9Sopenharmony_ci
19433d722a9Sopenharmony_ciimpl ToTokens for Struct {
19533d722a9Sopenharmony_ci    fn to_tokens(&self, tokens: &mut TokenStream) {
19633d722a9Sopenharmony_ci        // Notional token range for error reporting purposes.
19733d722a9Sopenharmony_ci        self.struct_token.to_tokens(tokens);
19833d722a9Sopenharmony_ci        self.name.rust.to_tokens(tokens);
19933d722a9Sopenharmony_ci        self.generics.to_tokens(tokens);
20033d722a9Sopenharmony_ci    }
20133d722a9Sopenharmony_ci}
20233d722a9Sopenharmony_ci
20333d722a9Sopenharmony_ciimpl ToTokens for Enum {
20433d722a9Sopenharmony_ci    fn to_tokens(&self, tokens: &mut TokenStream) {
20533d722a9Sopenharmony_ci        // Notional token range for error reporting purposes.
20633d722a9Sopenharmony_ci        self.enum_token.to_tokens(tokens);
20733d722a9Sopenharmony_ci        self.name.rust.to_tokens(tokens);
20833d722a9Sopenharmony_ci        self.generics.to_tokens(tokens);
20933d722a9Sopenharmony_ci    }
21033d722a9Sopenharmony_ci}
21133d722a9Sopenharmony_ci
21233d722a9Sopenharmony_ciimpl ToTokens for ExternFn {
21333d722a9Sopenharmony_ci    fn to_tokens(&self, tokens: &mut TokenStream) {
21433d722a9Sopenharmony_ci        // Notional token range for error reporting purposes.
21533d722a9Sopenharmony_ci        self.unsafety.to_tokens(tokens);
21633d722a9Sopenharmony_ci        self.sig.fn_token.to_tokens(tokens);
21733d722a9Sopenharmony_ci        self.semi_token.to_tokens(tokens);
21833d722a9Sopenharmony_ci    }
21933d722a9Sopenharmony_ci}
22033d722a9Sopenharmony_ci
22133d722a9Sopenharmony_ciimpl ToTokens for Impl {
22233d722a9Sopenharmony_ci    fn to_tokens(&self, tokens: &mut TokenStream) {
22333d722a9Sopenharmony_ci        let Impl {
22433d722a9Sopenharmony_ci            cfg: _,
22533d722a9Sopenharmony_ci            impl_token,
22633d722a9Sopenharmony_ci            impl_generics,
22733d722a9Sopenharmony_ci            negative: _,
22833d722a9Sopenharmony_ci            ty,
22933d722a9Sopenharmony_ci            ty_generics: _,
23033d722a9Sopenharmony_ci            brace_token,
23133d722a9Sopenharmony_ci            negative_token,
23233d722a9Sopenharmony_ci        } = self;
23333d722a9Sopenharmony_ci        impl_token.to_tokens(tokens);
23433d722a9Sopenharmony_ci        impl_generics.to_tokens(tokens);
23533d722a9Sopenharmony_ci        negative_token.to_tokens(tokens);
23633d722a9Sopenharmony_ci        ty.to_tokens(tokens);
23733d722a9Sopenharmony_ci        brace_token.surround(tokens, |_tokens| {});
23833d722a9Sopenharmony_ci    }
23933d722a9Sopenharmony_ci}
24033d722a9Sopenharmony_ci
24133d722a9Sopenharmony_ciimpl ToTokens for Lifetimes {
24233d722a9Sopenharmony_ci    fn to_tokens(&self, tokens: &mut TokenStream) {
24333d722a9Sopenharmony_ci        let Lifetimes {
24433d722a9Sopenharmony_ci            lt_token,
24533d722a9Sopenharmony_ci            lifetimes,
24633d722a9Sopenharmony_ci            gt_token,
24733d722a9Sopenharmony_ci        } = self;
24833d722a9Sopenharmony_ci        lt_token.to_tokens(tokens);
24933d722a9Sopenharmony_ci        lifetimes.to_tokens(tokens);
25033d722a9Sopenharmony_ci        gt_token.to_tokens(tokens);
25133d722a9Sopenharmony_ci    }
25233d722a9Sopenharmony_ci}
25333d722a9Sopenharmony_ci
25433d722a9Sopenharmony_ciimpl ToTokens for Signature {
25533d722a9Sopenharmony_ci    fn to_tokens(&self, tokens: &mut TokenStream) {
25633d722a9Sopenharmony_ci        let Signature {
25733d722a9Sopenharmony_ci            asyncness: _,
25833d722a9Sopenharmony_ci            unsafety: _,
25933d722a9Sopenharmony_ci            fn_token,
26033d722a9Sopenharmony_ci            generics: _,
26133d722a9Sopenharmony_ci            receiver: _,
26233d722a9Sopenharmony_ci            args,
26333d722a9Sopenharmony_ci            ret,
26433d722a9Sopenharmony_ci            throws: _,
26533d722a9Sopenharmony_ci            paren_token,
26633d722a9Sopenharmony_ci            throws_tokens,
26733d722a9Sopenharmony_ci        } = self;
26833d722a9Sopenharmony_ci        fn_token.to_tokens(tokens);
26933d722a9Sopenharmony_ci        paren_token.surround(tokens, |tokens| {
27033d722a9Sopenharmony_ci            args.to_tokens(tokens);
27133d722a9Sopenharmony_ci        });
27233d722a9Sopenharmony_ci        if let Some(ret) = ret {
27333d722a9Sopenharmony_ci            Token![->](paren_token.span.join()).to_tokens(tokens);
27433d722a9Sopenharmony_ci            if let Some((result, langle, rangle)) = throws_tokens {
27533d722a9Sopenharmony_ci                result.to_tokens(tokens);
27633d722a9Sopenharmony_ci                langle.to_tokens(tokens);
27733d722a9Sopenharmony_ci                ret.to_tokens(tokens);
27833d722a9Sopenharmony_ci                rangle.to_tokens(tokens);
27933d722a9Sopenharmony_ci            } else {
28033d722a9Sopenharmony_ci                ret.to_tokens(tokens);
28133d722a9Sopenharmony_ci            }
28233d722a9Sopenharmony_ci        } else if let Some((result, langle, rangle)) = throws_tokens {
28333d722a9Sopenharmony_ci            Token![->](paren_token.span.join()).to_tokens(tokens);
28433d722a9Sopenharmony_ci            result.to_tokens(tokens);
28533d722a9Sopenharmony_ci            langle.to_tokens(tokens);
28633d722a9Sopenharmony_ci            token::Paren(langle.span).surround(tokens, |_| ());
28733d722a9Sopenharmony_ci            rangle.to_tokens(tokens);
28833d722a9Sopenharmony_ci        }
28933d722a9Sopenharmony_ci    }
29033d722a9Sopenharmony_ci}
29133d722a9Sopenharmony_ci
29233d722a9Sopenharmony_ciimpl ToTokens for EnumRepr {
29333d722a9Sopenharmony_ci    fn to_tokens(&self, tokens: &mut TokenStream) {
29433d722a9Sopenharmony_ci        match self {
29533d722a9Sopenharmony_ci            EnumRepr::Native { atom, repr_type: _ } => atom.to_tokens(tokens),
29633d722a9Sopenharmony_ci            #[cfg(feature = "experimental-enum-variants-from-header")]
29733d722a9Sopenharmony_ci            EnumRepr::Foreign { rust_type } => rust_type.to_tokens(tokens),
29833d722a9Sopenharmony_ci        }
29933d722a9Sopenharmony_ci    }
30033d722a9Sopenharmony_ci}
30133d722a9Sopenharmony_ci
30233d722a9Sopenharmony_ciimpl ToTokens for NamedType {
30333d722a9Sopenharmony_ci    fn to_tokens(&self, tokens: &mut TokenStream) {
30433d722a9Sopenharmony_ci        let NamedType { rust, generics } = self;
30533d722a9Sopenharmony_ci        rust.to_tokens(tokens);
30633d722a9Sopenharmony_ci        generics.to_tokens(tokens);
30733d722a9Sopenharmony_ci    }
30833d722a9Sopenharmony_ci}
309