| David Tolnay | a52602b | 2020-03-06 10:24:34 -0800 | [diff] [blame] | 1 | use crate::syntax::atom::Atom::*; | 
| David Tolnay | fb6e386 | 2020-04-20 01:33:23 -0700 | [diff] [blame] | 2 | use crate::syntax::{Derive, ExternFn, Receiver, Ref, Signature, Slice, Ty1, Type, Var}; | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 3 | use proc_macro2::{Ident, Span, TokenStream}; | 
| David Tolnay | c071b89 | 2020-03-18 16:59:53 -0700 | [diff] [blame] | 4 | use quote::{quote_spanned, ToTokens}; | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 5 | use syn::Token; | 
 | 6 |  | 
 | 7 | impl ToTokens for Type { | 
 | 8 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 | 9 |         match self { | 
 | 10 |             Type::Ident(ident) => { | 
| David Tolnay | a52602b | 2020-03-06 10:24:34 -0800 | [diff] [blame] | 11 |                 if ident == CxxString { | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 12 |                     let span = ident.span(); | 
 | 13 |                     tokens.extend(quote_spanned!(span=> ::cxx::)); | 
 | 14 |                 } | 
 | 15 |                 ident.to_tokens(tokens); | 
 | 16 |             } | 
| Myron Ahn | eba35cf | 2020-02-05 19:41:51 +0700 | [diff] [blame^] | 17 |             Type::RustBox(ty) | Type::UniquePtr(ty) | Type::Vector(ty) | Type::RustVec(ty) => { | 
 | 18 |                 ty.to_tokens(tokens) | 
 | 19 |             } | 
| Adrian Taylor | f5dd552 | 2020-04-13 16:50:14 -0700 | [diff] [blame] | 20 |             Type::Ref(r) | Type::Str(r) | Type::SliceRefU8(r) => r.to_tokens(tokens), | 
 | 21 |             Type::Slice(s) => s.to_tokens(tokens), | 
| David Tolnay | c071b89 | 2020-03-18 16:59:53 -0700 | [diff] [blame] | 22 |             Type::Fn(f) => f.to_tokens(tokens), | 
| David Tolnay | d0bb364 | 2020-03-15 23:27:11 -0700 | [diff] [blame] | 23 |             Type::Void(span) => tokens.extend(quote_spanned!(*span=> ())), | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 24 |         } | 
 | 25 |     } | 
 | 26 | } | 
 | 27 |  | 
 | 28 | impl ToTokens for Var { | 
 | 29 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 | 30 |         self.ident.to_tokens(tokens); | 
 | 31 |         Token).to_tokens(tokens); | 
 | 32 |         self.ty.to_tokens(tokens); | 
 | 33 |     } | 
 | 34 | } | 
 | 35 |  | 
 | 36 | impl ToTokens for Ty1 { | 
 | 37 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
| Myron Ahn | eba35cf | 2020-02-05 19:41:51 +0700 | [diff] [blame^] | 38 |         // Do not add cxx namespace to Vector since we're defining it in the user crate | 
 | 39 |         if self.name == "UniquePtr" || self.name == "RustVec" { | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 40 |             let span = self.name.span(); | 
 | 41 |             tokens.extend(quote_spanned!(span=> ::cxx::)); | 
 | 42 |         } | 
 | 43 |         self.name.to_tokens(tokens); | 
 | 44 |         self.langle.to_tokens(tokens); | 
 | 45 |         self.inner.to_tokens(tokens); | 
 | 46 |         self.rangle.to_tokens(tokens); | 
 | 47 |     } | 
 | 48 | } | 
 | 49 |  | 
 | 50 | impl ToTokens for Ref { | 
 | 51 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 | 52 |         self.ampersand.to_tokens(tokens); | 
| David Tolnay | 0bd50fa | 2020-04-22 15:31:33 -0700 | [diff] [blame] | 53 |         self.lifetime.to_tokens(tokens); | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 54 |         self.mutability.to_tokens(tokens); | 
 | 55 |         self.inner.to_tokens(tokens); | 
 | 56 |     } | 
 | 57 | } | 
 | 58 |  | 
| Adrian Taylor | f5dd552 | 2020-04-13 16:50:14 -0700 | [diff] [blame] | 59 | impl ToTokens for Slice { | 
 | 60 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 | 61 |         self.bracket.surround(tokens, |tokens| { | 
 | 62 |             self.inner.to_tokens(tokens); | 
 | 63 |         }); | 
 | 64 |     } | 
 | 65 | } | 
 | 66 |  | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 67 | impl ToTokens for Derive { | 
 | 68 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 | 69 |         let name = match self { | 
 | 70 |             Derive::Clone => "Clone", | 
 | 71 |             Derive::Copy => "Copy", | 
 | 72 |         }; | 
 | 73 |         Ident::new(name, Span::call_site()).to_tokens(tokens); | 
 | 74 |     } | 
 | 75 | } | 
 | 76 |  | 
 | 77 | impl ToTokens for ExternFn { | 
 | 78 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
| David Tolnay | e3a4815 | 2020-04-08 19:38:05 -0700 | [diff] [blame] | 79 |         // Notional token range for error reporting purposes. | 
 | 80 |         self.sig.fn_token.to_tokens(tokens); | 
 | 81 |         self.semi_token.to_tokens(tokens); | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 82 |     } | 
 | 83 | } | 
| David Tolnay | c071b89 | 2020-03-18 16:59:53 -0700 | [diff] [blame] | 84 |  | 
 | 85 | impl ToTokens for Signature { | 
 | 86 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
| David Tolnay | e3a4815 | 2020-04-08 19:38:05 -0700 | [diff] [blame] | 87 |         self.fn_token.to_tokens(tokens); | 
 | 88 |         self.paren_token.surround(tokens, |tokens| { | 
 | 89 |             self.args.to_tokens(tokens); | 
 | 90 |         }); | 
 | 91 |         if let Some(ret) = &self.ret { | 
 | 92 |             Token.to_tokens(tokens); | 
 | 93 |             if let Some((result, langle, rangle)) = self.throws_tokens { | 
 | 94 |                 result.to_tokens(tokens); | 
 | 95 |                 langle.to_tokens(tokens); | 
 | 96 |                 ret.to_tokens(tokens); | 
 | 97 |                 rangle.to_tokens(tokens); | 
 | 98 |             } else { | 
 | 99 |                 ret.to_tokens(tokens); | 
 | 100 |             } | 
 | 101 |         } | 
| David Tolnay | c071b89 | 2020-03-18 16:59:53 -0700 | [diff] [blame] | 102 |     } | 
 | 103 | } | 
| David Tolnay | fb6e386 | 2020-04-20 01:33:23 -0700 | [diff] [blame] | 104 |  | 
| David Tolnay | 18ba92c | 2020-04-22 16:17:30 -0700 | [diff] [blame] | 105 | pub struct ReceiverType<'a>(&'a Receiver); | 
 | 106 |  | 
 | 107 | impl Receiver { | 
 | 108 |     // &TheType | 
 | 109 |     pub fn ty(&self) -> ReceiverType { | 
 | 110 |         ReceiverType(self) | 
 | 111 |     } | 
 | 112 | } | 
 | 113 |  | 
 | 114 | impl ToTokens for ReceiverType<'_> { | 
| David Tolnay | fb6e386 | 2020-04-20 01:33:23 -0700 | [diff] [blame] | 115 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
| David Tolnay | 18ba92c | 2020-04-22 16:17:30 -0700 | [diff] [blame] | 116 |         self.0.ampersand.to_tokens(tokens); | 
| David Tolnay | 0bd50fa | 2020-04-22 15:31:33 -0700 | [diff] [blame] | 117 |         self.0.lifetime.to_tokens(tokens); | 
| David Tolnay | 18ba92c | 2020-04-22 16:17:30 -0700 | [diff] [blame] | 118 |         self.0.mutability.to_tokens(tokens); | 
 | 119 |         self.0.ty.to_tokens(tokens); | 
| David Tolnay | fb6e386 | 2020-04-20 01:33:23 -0700 | [diff] [blame] | 120 |     } | 
 | 121 | } |