| use crate::syntax::atom::Atom::*; | 
 | use crate::syntax::{Derive, ExternFn, Ref, Ty1, Type, Var}; | 
 | use proc_macro2::{Ident, Span, TokenStream}; | 
 | use quote::{quote, quote_spanned, ToTokens}; | 
 | use syn::Token; | 
 |  | 
 | impl ToTokens for Type { | 
 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 |         match self { | 
 |             Type::Ident(ident) => { | 
 |                 if ident == CxxString { | 
 |                     let span = ident.span(); | 
 |                     tokens.extend(quote_spanned!(span=> ::cxx::)); | 
 |                 } | 
 |                 ident.to_tokens(tokens); | 
 |             } | 
 |             Type::RustBox(ty) | Type::UniquePtr(ty) => ty.to_tokens(tokens), | 
 |             Type::Ref(r) | Type::Str(r) => r.to_tokens(tokens), | 
 |             Type::Fn(f) => { | 
 |                 let fn_token = f.fn_token; | 
 |                 let args = &f.args; | 
 |                 tokens.extend(quote!(#fn_token(#(#args),*))); | 
 |                 let mut ret = match &f.ret { | 
 |                     Some(ret) => quote!(#ret), | 
 |                     None => quote!(()), | 
 |                 }; | 
 |                 if f.throws { | 
 |                     ret = quote!(::std::result::Result<#ret, _>); | 
 |                 } | 
 |                 if f.ret.is_some() || f.throws { | 
 |                     tokens.extend(quote!(-> #ret)); | 
 |                 } | 
 |             } | 
 |             Type::Void(span) => tokens.extend(quote_spanned!(*span=> ())), | 
 |         } | 
 |     } | 
 | } | 
 |  | 
 | impl ToTokens for Var { | 
 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 |         self.ident.to_tokens(tokens); | 
 |         Token).to_tokens(tokens); | 
 |         self.ty.to_tokens(tokens); | 
 |     } | 
 | } | 
 |  | 
 | impl ToTokens for Ty1 { | 
 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 |         if self.name == "UniquePtr" { | 
 |             let span = self.name.span(); | 
 |             tokens.extend(quote_spanned!(span=> ::cxx::)); | 
 |         } | 
 |         self.name.to_tokens(tokens); | 
 |         self.langle.to_tokens(tokens); | 
 |         self.inner.to_tokens(tokens); | 
 |         self.rangle.to_tokens(tokens); | 
 |     } | 
 | } | 
 |  | 
 | impl ToTokens for Ref { | 
 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 |         self.ampersand.to_tokens(tokens); | 
 |         self.mutability.to_tokens(tokens); | 
 |         self.inner.to_tokens(tokens); | 
 |     } | 
 | } | 
 |  | 
 | impl ToTokens for Derive { | 
 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 |         let name = match self { | 
 |             Derive::Clone => "Clone", | 
 |             Derive::Copy => "Copy", | 
 |         }; | 
 |         Ident::new(name, Span::call_site()).to_tokens(tokens); | 
 |     } | 
 | } | 
 |  | 
 | impl ToTokens for ExternFn { | 
 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 |         self.fn_token.to_tokens(tokens); | 
 |         self.ident.to_tokens(tokens); | 
 |         self.semi_token.to_tokens(tokens); | 
 |     } | 
 | } |