| David Tolnay | a52602b | 2020-03-06 10:24:34 -0800 | [diff] [blame] | 1 | use crate::syntax::atom::Atom::*; | 
| David Tolnay | 83496eb | 2020-05-04 00:36:53 -0700 | [diff] [blame] | 2 | use crate::syntax::{ | 
| David Tolnay | b600e4f | 2020-11-27 17:26:49 -0800 | [diff] [blame] | 3 |     Array, Atom, Derive, Enum, ExternFn, ExternType, Impl, Receiver, Ref, ResolvableName, | 
 | 4 |     Signature, SliceRef, Struct, Ty1, Type, TypeAlias, Var, | 
| David Tolnay | 83496eb | 2020-05-04 00:36:53 -0700 | [diff] [blame] | 5 | }; | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 6 | use proc_macro2::{Ident, Span, TokenStream}; | 
| David Tolnay | c071b89 | 2020-03-18 16:59:53 -0700 | [diff] [blame] | 7 | use quote::{quote_spanned, ToTokens}; | 
| David Tolnay | 57c166d | 2020-11-14 23:38:31 -0800 | [diff] [blame] | 8 | use syn::{token, Token}; | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 9 |  | 
 | 10 | impl ToTokens for Type { | 
 | 11 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 | 12 |         match self { | 
 | 13 |             Type::Ident(ident) => { | 
| David Tolnay | b3873dc | 2020-11-25 19:47:49 -0800 | [diff] [blame] | 14 |                 if ident.rust == Char { | 
 | 15 |                     let span = ident.rust.span(); | 
 | 16 |                     tokens.extend(quote_spanned!(span=> ::std::os::raw::)); | 
 | 17 |                 } else if ident.rust == CxxString { | 
| Adrian Taylor | c871343 | 2020-10-21 18:20:55 -0700 | [diff] [blame] | 18 |                     let span = ident.rust.span(); | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 19 |                     tokens.extend(quote_spanned!(span=> ::cxx::)); | 
 | 20 |                 } | 
| Adrian Taylor | c871343 | 2020-10-21 18:20:55 -0700 | [diff] [blame] | 21 |                 ident.rust.to_tokens(tokens); | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 22 |             } | 
| David Tolnay | 4377a9e | 2020-04-24 15:20:26 -0700 | [diff] [blame] | 23 |             Type::RustBox(ty) | Type::UniquePtr(ty) | Type::CxxVector(ty) | Type::RustVec(ty) => { | 
| Myron Ahn | eba35cf | 2020-02-05 19:41:51 +0700 | [diff] [blame] | 24 |                 ty.to_tokens(tokens) | 
 | 25 |             } | 
| David Tolnay | e0dca7b | 2020-11-25 17:18:57 -0800 | [diff] [blame] | 26 |             Type::Ref(r) | Type::Str(r) => r.to_tokens(tokens), | 
| Xiangpeng Hao | 7876235 | 2020-11-12 10:24:18 +0800 | [diff] [blame] | 27 |             Type::Array(a) => a.to_tokens(tokens), | 
| David Tolnay | c071b89 | 2020-03-18 16:59:53 -0700 | [diff] [blame] | 28 |             Type::Fn(f) => f.to_tokens(tokens), | 
| David Tolnay | d0bb364 | 2020-03-15 23:27:11 -0700 | [diff] [blame] | 29 |             Type::Void(span) => tokens.extend(quote_spanned!(*span=> ())), | 
| David Tolnay | 73b7264 | 2020-11-25 17:44:05 -0800 | [diff] [blame] | 30 |             Type::SliceRef(r) => r.to_tokens(tokens), | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 31 |         } | 
 | 32 |     } | 
 | 33 | } | 
 | 34 |  | 
 | 35 | impl ToTokens for Var { | 
 | 36 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 | 37 |         self.ident.to_tokens(tokens); | 
 | 38 |         Token).to_tokens(tokens); | 
 | 39 |         self.ty.to_tokens(tokens); | 
 | 40 |     } | 
 | 41 | } | 
 | 42 |  | 
 | 43 | impl ToTokens for Ty1 { | 
 | 44 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
| David Tolnay | 51cc8ee | 2020-04-25 14:10:29 -0700 | [diff] [blame] | 45 |         let span = self.name.span(); | 
| David Tolnay | da71ef6 | 2020-11-02 00:36:00 -0800 | [diff] [blame] | 46 |         let name = self.name.to_string(); | 
| David Tolnay | 51cc8ee | 2020-04-25 14:10:29 -0700 | [diff] [blame] | 47 |         if let "UniquePtr" | "CxxVector" = name.as_str() { | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 48 |             tokens.extend(quote_spanned!(span=> ::cxx::)); | 
| David Tolnay | 51cc8ee | 2020-04-25 14:10:29 -0700 | [diff] [blame] | 49 |         } else if name == "Vec" { | 
 | 50 |             tokens.extend(quote_spanned!(span=> ::std::vec::)); | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 51 |         } | 
 | 52 |         self.name.to_tokens(tokens); | 
 | 53 |         self.langle.to_tokens(tokens); | 
 | 54 |         self.inner.to_tokens(tokens); | 
 | 55 |         self.rangle.to_tokens(tokens); | 
 | 56 |     } | 
 | 57 | } | 
 | 58 |  | 
 | 59 | impl ToTokens for Ref { | 
 | 60 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
| David Tolnay | c967384 | 2020-11-15 16:26:10 -0800 | [diff] [blame] | 61 |         if let Some((pin, langle, _rangle)) = self.pin_tokens { | 
 | 62 |             tokens.extend(quote_spanned!(pin.span=> ::std::pin::Pin)); | 
 | 63 |             langle.to_tokens(tokens); | 
 | 64 |         } | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 65 |         self.ampersand.to_tokens(tokens); | 
| David Tolnay | 0bd50fa | 2020-04-22 15:31:33 -0700 | [diff] [blame] | 66 |         self.lifetime.to_tokens(tokens); | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 67 |         self.mutability.to_tokens(tokens); | 
 | 68 |         self.inner.to_tokens(tokens); | 
| David Tolnay | c967384 | 2020-11-15 16:26:10 -0800 | [diff] [blame] | 69 |         if let Some((_pin, _langle, rangle)) = self.pin_tokens { | 
 | 70 |             rangle.to_tokens(tokens); | 
 | 71 |         } | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 72 |     } | 
 | 73 | } | 
 | 74 |  | 
| David Tolnay | e0dca7b | 2020-11-25 17:18:57 -0800 | [diff] [blame] | 75 | impl ToTokens for SliceRef { | 
 | 76 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 | 77 |         self.ampersand.to_tokens(tokens); | 
 | 78 |         self.lifetime.to_tokens(tokens); | 
 | 79 |         self.mutability.to_tokens(tokens); | 
 | 80 |         self.bracket.surround(tokens, |tokens| { | 
 | 81 |             self.inner.to_tokens(tokens); | 
 | 82 |         }); | 
 | 83 |     } | 
 | 84 | } | 
 | 85 |  | 
| Xiangpeng Hao | 7876235 | 2020-11-12 10:24:18 +0800 | [diff] [blame] | 86 | impl ToTokens for Array { | 
 | 87 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 | 88 |         self.bracket.surround(tokens, |tokens| { | 
 | 89 |             self.inner.to_tokens(tokens); | 
 | 90 |             self.semi_token.to_tokens(tokens); | 
| David Tolnay | c351dc4 | 2020-11-24 20:45:13 -0800 | [diff] [blame] | 91 |             self.len_token.to_tokens(tokens); | 
| Xiangpeng Hao | 7876235 | 2020-11-12 10:24:18 +0800 | [diff] [blame] | 92 |         }); | 
 | 93 |     } | 
 | 94 | } | 
 | 95 |  | 
| David Tolnay | c605e6f | 2020-05-10 23:37:12 -0700 | [diff] [blame] | 96 | impl ToTokens for Atom { | 
 | 97 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 | 98 |         Ident::new(self.as_ref(), Span::call_site()).to_tokens(tokens); | 
 | 99 |     } | 
 | 100 | } | 
 | 101 |  | 
| David Tolnay | b600e4f | 2020-11-27 17:26:49 -0800 | [diff] [blame] | 102 | impl ToTokens for Derive { | 
 | 103 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 | 104 |         Ident::new(self.what.as_ref(), self.span).to_tokens(tokens); | 
 | 105 |     } | 
 | 106 | } | 
 | 107 |  | 
| David Tolnay | 83496eb | 2020-05-04 00:36:53 -0700 | [diff] [blame] | 108 | impl ToTokens for ExternType { | 
 | 109 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 | 110 |         // Notional token range for error reporting purposes. | 
 | 111 |         self.type_token.to_tokens(tokens); | 
| David Tolnay | 9bb232b | 2020-11-02 00:55:18 -0800 | [diff] [blame] | 112 |         self.name.rust.to_tokens(tokens); | 
| David Tolnay | 83496eb | 2020-05-04 00:36:53 -0700 | [diff] [blame] | 113 |     } | 
 | 114 | } | 
 | 115 |  | 
| David Tolnay | 9938381 | 2020-05-04 02:34:33 -0700 | [diff] [blame] | 116 | impl ToTokens for TypeAlias { | 
 | 117 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 | 118 |         // Notional token range for error reporting purposes. | 
 | 119 |         self.type_token.to_tokens(tokens); | 
| David Tolnay | 9bb232b | 2020-11-02 00:55:18 -0800 | [diff] [blame] | 120 |         self.name.rust.to_tokens(tokens); | 
| David Tolnay | 9938381 | 2020-05-04 02:34:33 -0700 | [diff] [blame] | 121 |     } | 
 | 122 | } | 
 | 123 |  | 
| David Tolnay | 83496eb | 2020-05-04 00:36:53 -0700 | [diff] [blame] | 124 | impl ToTokens for Struct { | 
 | 125 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 | 126 |         // Notional token range for error reporting purposes. | 
 | 127 |         self.struct_token.to_tokens(tokens); | 
| David Tolnay | 9bb232b | 2020-11-02 00:55:18 -0800 | [diff] [blame] | 128 |         self.name.rust.to_tokens(tokens); | 
| David Tolnay | 83496eb | 2020-05-04 00:36:53 -0700 | [diff] [blame] | 129 |     } | 
 | 130 | } | 
 | 131 |  | 
 | 132 | impl ToTokens for Enum { | 
 | 133 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 | 134 |         // Notional token range for error reporting purposes. | 
 | 135 |         self.enum_token.to_tokens(tokens); | 
| David Tolnay | 9bb232b | 2020-11-02 00:55:18 -0800 | [diff] [blame] | 136 |         self.name.rust.to_tokens(tokens); | 
| David Tolnay | 83496eb | 2020-05-04 00:36:53 -0700 | [diff] [blame] | 137 |     } | 
 | 138 | } | 
 | 139 |  | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 140 | impl ToTokens for ExternFn { | 
 | 141 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
| David Tolnay | e3a4815 | 2020-04-08 19:38:05 -0700 | [diff] [blame] | 142 |         // Notional token range for error reporting purposes. | 
 | 143 |         self.sig.fn_token.to_tokens(tokens); | 
 | 144 |         self.semi_token.to_tokens(tokens); | 
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 145 |     } | 
 | 146 | } | 
| David Tolnay | c071b89 | 2020-03-18 16:59:53 -0700 | [diff] [blame] | 147 |  | 
| David Tolnay | 7e69f89 | 2020-10-03 22:20:22 -0700 | [diff] [blame] | 148 | impl ToTokens for Impl { | 
 | 149 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 | 150 |         self.impl_token.to_tokens(tokens); | 
| David Tolnay | 028d3d2 | 2020-11-29 18:09:52 -0800 | [diff] [blame] | 151 |         self.negative_token.to_tokens(tokens); | 
| David Tolnay | 7e69f89 | 2020-10-03 22:20:22 -0700 | [diff] [blame] | 152 |         self.ty.to_tokens(tokens); | 
 | 153 |         self.brace_token.surround(tokens, |_tokens| {}); | 
 | 154 |     } | 
 | 155 | } | 
 | 156 |  | 
| David Tolnay | c071b89 | 2020-03-18 16:59:53 -0700 | [diff] [blame] | 157 | impl ToTokens for Signature { | 
 | 158 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
| David Tolnay | e3a4815 | 2020-04-08 19:38:05 -0700 | [diff] [blame] | 159 |         self.fn_token.to_tokens(tokens); | 
 | 160 |         self.paren_token.surround(tokens, |tokens| { | 
 | 161 |             self.args.to_tokens(tokens); | 
 | 162 |         }); | 
 | 163 |         if let Some(ret) = &self.ret { | 
 | 164 |             Token.to_tokens(tokens); | 
 | 165 |             if let Some((result, langle, rangle)) = self.throws_tokens { | 
 | 166 |                 result.to_tokens(tokens); | 
 | 167 |                 langle.to_tokens(tokens); | 
 | 168 |                 ret.to_tokens(tokens); | 
 | 169 |                 rangle.to_tokens(tokens); | 
 | 170 |             } else { | 
 | 171 |                 ret.to_tokens(tokens); | 
 | 172 |             } | 
| David Tolnay | 57c166d | 2020-11-14 23:38:31 -0800 | [diff] [blame] | 173 |         } else if let Some((result, langle, rangle)) = self.throws_tokens { | 
 | 174 |             Token.to_tokens(tokens); | 
 | 175 |             result.to_tokens(tokens); | 
 | 176 |             langle.to_tokens(tokens); | 
 | 177 |             token::Paren(langle.span).surround(tokens, |_| ()); | 
 | 178 |             rangle.to_tokens(tokens); | 
| David Tolnay | e3a4815 | 2020-04-08 19:38:05 -0700 | [diff] [blame] | 179 |         } | 
| David Tolnay | c071b89 | 2020-03-18 16:59:53 -0700 | [diff] [blame] | 180 |     } | 
 | 181 | } | 
| David Tolnay | fb6e386 | 2020-04-20 01:33:23 -0700 | [diff] [blame] | 182 |  | 
| Adrian Taylor | c871343 | 2020-10-21 18:20:55 -0700 | [diff] [blame] | 183 | impl ToTokens for ResolvableName { | 
 | 184 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
 | 185 |         self.rust.to_tokens(tokens); | 
 | 186 |     } | 
 | 187 | } | 
 | 188 |  | 
| David Tolnay | 18ba92c | 2020-04-22 16:17:30 -0700 | [diff] [blame] | 189 | pub struct ReceiverType<'a>(&'a Receiver); | 
 | 190 |  | 
 | 191 | impl Receiver { | 
 | 192 |     // &TheType | 
 | 193 |     pub fn ty(&self) -> ReceiverType { | 
 | 194 |         ReceiverType(self) | 
 | 195 |     } | 
 | 196 | } | 
 | 197 |  | 
 | 198 | impl ToTokens for ReceiverType<'_> { | 
| David Tolnay | fb6e386 | 2020-04-20 01:33:23 -0700 | [diff] [blame] | 199 |     fn to_tokens(&self, tokens: &mut TokenStream) { | 
| David Tolnay | c967384 | 2020-11-15 16:26:10 -0800 | [diff] [blame] | 200 |         if let Some((pin, langle, _rangle)) = self.0.pin_tokens { | 
 | 201 |             tokens.extend(quote_spanned!(pin.span=> ::std::pin::Pin)); | 
 | 202 |             langle.to_tokens(tokens); | 
 | 203 |         } | 
| David Tolnay | 18ba92c | 2020-04-22 16:17:30 -0700 | [diff] [blame] | 204 |         self.0.ampersand.to_tokens(tokens); | 
| David Tolnay | 0bd50fa | 2020-04-22 15:31:33 -0700 | [diff] [blame] | 205 |         self.0.lifetime.to_tokens(tokens); | 
| David Tolnay | 18ba92c | 2020-04-22 16:17:30 -0700 | [diff] [blame] | 206 |         self.0.mutability.to_tokens(tokens); | 
 | 207 |         self.0.ty.to_tokens(tokens); | 
| David Tolnay | c967384 | 2020-11-15 16:26:10 -0800 | [diff] [blame] | 208 |         if let Some((_pin, _langle, rangle)) = self.0.pin_tokens { | 
 | 209 |             rangle.to_tokens(tokens); | 
 | 210 |         } | 
| David Tolnay | fb6e386 | 2020-04-20 01:33:23 -0700 | [diff] [blame] | 211 |     } | 
 | 212 | } |