| 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 |             } | 
| David Tolnay | 4377a9e | 2020-04-24 15:20:26 -0700 | [diff] [blame] | 17 |             Type::RustBox(ty) | Type::UniquePtr(ty) | Type::CxxVector(ty) | Type::RustVec(ty) => { | 
| Myron Ahn | eba35cf | 2020-02-05 19:41:51 +0700 | [diff] [blame] | 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) { | 
| David Tolnay | 51cc8ee | 2020-04-25 14:10:29 -0700 | [diff] [blame^] | 38 |         let span = self.name.span(); | 
 | 39 |         let name = self.name.to_string(); | 
 | 40 |         if let "UniquePtr" | "CxxVector" = name.as_str() { | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 41 |             tokens.extend(quote_spanned!(span=> ::cxx::)); | 
| David Tolnay | 51cc8ee | 2020-04-25 14:10:29 -0700 | [diff] [blame^] | 42 |         } else if name == "Vec" { | 
 | 43 |             tokens.extend(quote_spanned!(span=> ::std::vec::)); | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 44 |         } | 
 | 45 |         self.name.to_tokens(tokens); | 
 | 46 |         self.langle.to_tokens(tokens); | 
 | 47 |         self.inner.to_tokens(tokens); | 
 | 48 |         self.rangle.to_tokens(tokens); | 
 | 49 |     } | 
 | 50 | } | 
 | 51 |  | 
 | 52 | impl ToTokens for Ref { | 
 | 53 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 | 54 |         self.ampersand.to_tokens(tokens); | 
| David Tolnay | 0bd50fa | 2020-04-22 15:31:33 -0700 | [diff] [blame] | 55 |         self.lifetime.to_tokens(tokens); | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 56 |         self.mutability.to_tokens(tokens); | 
 | 57 |         self.inner.to_tokens(tokens); | 
 | 58 |     } | 
 | 59 | } | 
 | 60 |  | 
| Adrian Taylor | f5dd552 | 2020-04-13 16:50:14 -0700 | [diff] [blame] | 61 | impl ToTokens for Slice { | 
 | 62 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 | 63 |         self.bracket.surround(tokens, |tokens| { | 
 | 64 |             self.inner.to_tokens(tokens); | 
 | 65 |         }); | 
 | 66 |     } | 
 | 67 | } | 
 | 68 |  | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 69 | impl ToTokens for Derive { | 
 | 70 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 | 71 |         let name = match self { | 
 | 72 |             Derive::Clone => "Clone", | 
 | 73 |             Derive::Copy => "Copy", | 
 | 74 |         }; | 
 | 75 |         Ident::new(name, Span::call_site()).to_tokens(tokens); | 
 | 76 |     } | 
 | 77 | } | 
 | 78 |  | 
 | 79 | impl ToTokens for ExternFn { | 
 | 80 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
| David Tolnay | e3a4815 | 2020-04-08 19:38:05 -0700 | [diff] [blame] | 81 |         // Notional token range for error reporting purposes. | 
 | 82 |         self.sig.fn_token.to_tokens(tokens); | 
 | 83 |         self.semi_token.to_tokens(tokens); | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 84 |     } | 
 | 85 | } | 
| David Tolnay | c071b89 | 2020-03-18 16:59:53 -0700 | [diff] [blame] | 86 |  | 
 | 87 | impl ToTokens for Signature { | 
 | 88 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
| David Tolnay | e3a4815 | 2020-04-08 19:38:05 -0700 | [diff] [blame] | 89 |         self.fn_token.to_tokens(tokens); | 
 | 90 |         self.paren_token.surround(tokens, |tokens| { | 
 | 91 |             self.args.to_tokens(tokens); | 
 | 92 |         }); | 
 | 93 |         if let Some(ret) = &self.ret { | 
 | 94 |             Token.to_tokens(tokens); | 
 | 95 |             if let Some((result, langle, rangle)) = self.throws_tokens { | 
 | 96 |                 result.to_tokens(tokens); | 
 | 97 |                 langle.to_tokens(tokens); | 
 | 98 |                 ret.to_tokens(tokens); | 
 | 99 |                 rangle.to_tokens(tokens); | 
 | 100 |             } else { | 
 | 101 |                 ret.to_tokens(tokens); | 
 | 102 |             } | 
 | 103 |         } | 
| David Tolnay | c071b89 | 2020-03-18 16:59:53 -0700 | [diff] [blame] | 104 |     } | 
 | 105 | } | 
| David Tolnay | fb6e386 | 2020-04-20 01:33:23 -0700 | [diff] [blame] | 106 |  | 
| David Tolnay | 18ba92c | 2020-04-22 16:17:30 -0700 | [diff] [blame] | 107 | pub struct ReceiverType<'a>(&'a Receiver); | 
 | 108 |  | 
 | 109 | impl Receiver { | 
 | 110 |     // &TheType | 
 | 111 |     pub fn ty(&self) -> ReceiverType { | 
 | 112 |         ReceiverType(self) | 
 | 113 |     } | 
 | 114 | } | 
 | 115 |  | 
 | 116 | impl ToTokens for ReceiverType<'_> { | 
| David Tolnay | fb6e386 | 2020-04-20 01:33:23 -0700 | [diff] [blame] | 117 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
| David Tolnay | 18ba92c | 2020-04-22 16:17:30 -0700 | [diff] [blame] | 118 |         self.0.ampersand.to_tokens(tokens); | 
| David Tolnay | 0bd50fa | 2020-04-22 15:31:33 -0700 | [diff] [blame] | 119 |         self.0.lifetime.to_tokens(tokens); | 
| David Tolnay | 18ba92c | 2020-04-22 16:17:30 -0700 | [diff] [blame] | 120 |         self.0.mutability.to_tokens(tokens); | 
 | 121 |         self.0.ty.to_tokens(tokens); | 
| David Tolnay | fb6e386 | 2020-04-20 01:33:23 -0700 | [diff] [blame] | 122 |     } | 
 | 123 | } |