@@ -68,72 +68,61 @@ pub mod rt {
68
68
69
69
*/
70
70
71
+ // FIXME: Move this trait to pprust and get rid of *_to_str?
71
72
pub trait ToSource {
72
73
// Takes a thing and generates a string containing rust code for it.
73
74
fn to_source ( & self ) -> String ;
74
75
}
75
76
76
- impl ToSource for ast:: Ident {
77
- fn to_source ( & self ) -> String {
78
- token:: get_ident ( * self ) . get ( ) . to_string ( )
79
- }
80
- }
81
-
82
- impl ToSource for Gc < ast:: Item > {
83
- fn to_source ( & self ) -> String {
84
- pprust:: item_to_str ( & * * self )
85
- }
86
- }
87
-
88
- impl < ' a > ToSource for & ' a [ Gc < ast:: Item > ] {
89
- fn to_source ( & self ) -> String {
90
- self . iter ( )
91
- . map ( |i| i. to_source ( ) )
92
- . collect :: < Vec < String > > ( )
93
- . connect ( "\n \n " )
94
- . to_string ( )
95
- }
96
- }
97
-
98
- impl ToSource for ast:: Ty {
99
- fn to_source ( & self ) -> String {
100
- pprust:: ty_to_str ( self )
101
- }
102
- }
103
-
104
- impl < ' a > ToSource for & ' a [ ast:: Ty ] {
105
- fn to_source ( & self ) -> String {
106
- self . iter ( )
107
- . map ( |i| i. to_source ( ) )
108
- . collect :: < Vec < String > > ( )
109
- . connect ( ", " )
110
- . to_string ( )
111
- }
112
- }
77
+ macro_rules! impl_to_source(
78
+ ( Gc <$t: ty>, $pp: ident) => (
79
+ impl ToSource for Gc <$t> {
80
+ fn to_source( & self ) -> String {
81
+ pprust:: $pp( & * * self )
82
+ }
83
+ }
84
+ ) ;
85
+ ( $t: ty, $pp: ident) => (
86
+ impl ToSource for $t {
87
+ fn to_source( & self ) -> String {
88
+ pprust:: $pp( self )
89
+ }
90
+ }
91
+ ) ;
92
+ )
113
93
114
- impl ToSource for Generics {
115
- fn to_source ( & self ) -> String {
116
- pprust:: generics_to_str ( self )
117
- }
94
+ fn slice_to_source < ' a , T : ToSource > ( sep : & ' static str , xs : & ' a [ T ] ) -> String {
95
+ xs. iter ( )
96
+ . map ( |i| i. to_source ( ) )
97
+ . collect :: < Vec < String > > ( )
98
+ . connect ( sep)
99
+ . to_string ( )
118
100
}
119
101
120
- impl ToSource for Gc < ast:: Expr > {
121
- fn to_source ( & self ) -> String {
122
- pprust:: expr_to_str ( & * * self )
123
- }
124
- }
102
+ macro_rules! impl_to_source_slice(
103
+ ( $t: ty, $sep: expr) => (
104
+ impl <' a> ToSource for & ' a [ $t] {
105
+ fn to_source( & self ) -> String {
106
+ slice_to_source( $sep, * self )
107
+ }
108
+ }
109
+ )
110
+ )
125
111
126
- impl ToSource for ast:: Block {
112
+ impl ToSource for ast:: Ident {
127
113
fn to_source ( & self ) -> String {
128
- pprust :: block_to_str ( self )
114
+ token :: get_ident ( * self ) . get ( ) . to_string ( )
129
115
}
130
116
}
131
117
132
- impl ToSource for ast:: Arg {
133
- fn to_source ( & self ) -> String {
134
- pprust:: arg_to_str ( self )
135
- }
136
- }
118
+ impl_to_source ! ( ast:: Ty , ty_to_str)
119
+ impl_to_source ! ( ast:: Block , block_to_str)
120
+ impl_to_source ! ( ast:: Arg , arg_to_str)
121
+ impl_to_source ! ( Generics , generics_to_str)
122
+ impl_to_source ! ( Gc <ast:: Item >, item_to_str)
123
+ impl_to_source ! ( Gc <ast:: Expr >, expr_to_str)
124
+ impl_to_source_slice ! ( ast:: Ty , ", " )
125
+ impl_to_source_slice ! ( Gc <ast:: Item >, "\n \n " )
137
126
138
127
impl < ' a > ToSource for & ' a str {
139
128
fn to_source ( & self ) -> String {
@@ -163,76 +152,36 @@ pub mod rt {
163
152
}
164
153
}
165
154
166
- impl ToSource for int {
167
- fn to_source ( & self ) -> String {
168
- let lit = dummy_spanned ( ast:: LitInt ( * self as i64 , ast:: TyI ) ) ;
169
- pprust:: lit_to_str ( & lit)
170
- }
171
- }
172
-
173
- impl ToSource for i8 {
174
- fn to_source ( & self ) -> String {
175
- let lit = dummy_spanned ( ast:: LitInt ( * self as i64 , ast:: TyI8 ) ) ;
176
- pprust:: lit_to_str ( & lit)
177
- }
178
- }
179
-
180
- impl ToSource for i16 {
181
- fn to_source ( & self ) -> String {
182
- let lit = dummy_spanned ( ast:: LitInt ( * self as i64 , ast:: TyI16 ) ) ;
183
- pprust:: lit_to_str ( & lit)
184
- }
185
- }
186
-
187
-
188
- impl ToSource for i32 {
189
- fn to_source ( & self ) -> String {
190
- let lit = dummy_spanned ( ast:: LitInt ( * self as i64 , ast:: TyI32 ) ) ;
191
- pprust:: lit_to_str ( & lit)
192
- }
193
- }
194
-
195
- impl ToSource for i64 {
196
- fn to_source ( & self ) -> String {
197
- let lit = dummy_spanned ( ast:: LitInt ( * self as i64 , ast:: TyI64 ) ) ;
198
- pprust:: lit_to_str ( & lit)
199
- }
200
- }
201
-
202
- impl ToSource for uint {
203
- fn to_source ( & self ) -> String {
204
- let lit = dummy_spanned ( ast:: LitUint ( * self as u64 , ast:: TyU ) ) ;
205
- pprust:: lit_to_str ( & lit)
206
- }
207
- }
208
-
209
- impl ToSource for u8 {
210
- fn to_source ( & self ) -> String {
211
- let lit = dummy_spanned ( ast:: LitUint ( * self as u64 , ast:: TyU8 ) ) ;
212
- pprust:: lit_to_str ( & lit)
213
- }
214
- }
215
-
216
- impl ToSource for u16 {
217
- fn to_source ( & self ) -> String {
218
- let lit = dummy_spanned ( ast:: LitUint ( * self as u64 , ast:: TyU16 ) ) ;
219
- pprust:: lit_to_str ( & lit)
220
- }
221
- }
155
+ macro_rules! impl_to_source_int(
156
+ ( signed, $t: ty, $tag: ident) => (
157
+ impl ToSource for $t {
158
+ fn to_source( & self ) -> String {
159
+ let lit = dummy_spanned( ast:: LitInt ( * self as i64 , ast:: $tag) ) ;
160
+ pprust:: lit_to_str( & lit)
161
+ }
162
+ }
163
+ ) ;
164
+ ( unsigned, $t: ty, $tag: ident) => (
165
+ impl ToSource for $t {
166
+ fn to_source( & self ) -> String {
167
+ let lit = dummy_spanned( ast:: LitUint ( * self as u64 , ast:: $tag) ) ;
168
+ pprust:: lit_to_str( & lit)
169
+ }
170
+ }
171
+ ) ;
172
+ )
222
173
223
- impl ToSource for u32 {
224
- fn to_source ( & self ) -> String {
225
- let lit = dummy_spanned ( ast:: LitUint ( * self as u64 , ast:: TyU32 ) ) ;
226
- pprust:: lit_to_str ( & lit)
227
- }
228
- }
174
+ impl_to_source_int ! ( signed, int, TyI )
175
+ impl_to_source_int ! ( signed, i8 , TyI8 )
176
+ impl_to_source_int ! ( signed, i16 , TyI16 )
177
+ impl_to_source_int ! ( signed, i32 , TyI32 )
178
+ impl_to_source_int ! ( signed, i64 , TyI64 )
229
179
230
- impl ToSource for u64 {
231
- fn to_source ( & self ) -> String {
232
- let lit = dummy_spanned ( ast:: LitUint ( * self as u64 , ast:: TyU64 ) ) ;
233
- pprust:: lit_to_str ( & lit)
234
- }
235
- }
180
+ impl_to_source_int ! ( unsigned, uint, TyU )
181
+ impl_to_source_int ! ( unsigned, u8 , TyU8 )
182
+ impl_to_source_int ! ( unsigned, u16 , TyU16 )
183
+ impl_to_source_int ! ( unsigned, u32 , TyU32 )
184
+ impl_to_source_int ! ( unsigned, u64 , TyU64 )
236
185
237
186
// Alas ... we write these out instead. All redundant.
238
187
@@ -246,7 +195,7 @@ pub mod rt {
246
195
)
247
196
)
248
197
249
- macro_rules! impl_to_tokens_self (
198
+ macro_rules! impl_to_tokens_lifetime (
250
199
( $t: ty) => (
251
200
impl <' a> ToTokens for $t {
252
201
fn to_tokens( & self , cx: & ExtCtxt ) -> Vec <TokenTree > {
@@ -258,14 +207,14 @@ pub mod rt {
258
207
259
208
impl_to_tokens ! ( ast:: Ident )
260
209
impl_to_tokens ! ( Gc <ast:: Item >)
261
- impl_to_tokens_self ! ( & ' a [ Gc <ast:: Item >] )
210
+ impl_to_tokens_lifetime ! ( & ' a [ Gc <ast:: Item >] )
262
211
impl_to_tokens ! ( ast:: Ty )
263
- impl_to_tokens_self ! ( & ' a [ ast:: Ty ] )
212
+ impl_to_tokens_lifetime ! ( & ' a [ ast:: Ty ] )
264
213
impl_to_tokens ! ( Generics )
265
214
impl_to_tokens ! ( Gc <ast:: Expr >)
266
215
impl_to_tokens ! ( ast:: Block )
267
216
impl_to_tokens ! ( ast:: Arg )
268
- impl_to_tokens_self ! ( & ' a str )
217
+ impl_to_tokens_lifetime ! ( & ' a str )
269
218
impl_to_tokens ! ( ( ) )
270
219
impl_to_tokens ! ( char )
271
220
impl_to_tokens ! ( bool )
0 commit comments