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).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).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).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