@@ -34,66 +34,26 @@ use std::hashmap::HashMap;
34
34
use std:: iter:: Enumerate ;
35
35
use std:: vec;
36
36
37
+ // The actual lang items defined come at the end of this file in one handy table.
38
+ // So you probably just want to nip down to the end.
39
+ macro_rules! lets_do_this {
40
+ (
41
+ There are $num_lang_items: expr lang items.
42
+ $( $num: pat, $variant: ident, $name: expr, $method: ident; ) *
43
+ ) => {
44
+
37
45
pub enum LangItem {
38
- FreezeTraitLangItem , // 0
39
- SendTraitLangItem , // 1
40
- SizedTraitLangItem , // 2
41
-
42
- DropTraitLangItem , // 3
43
-
44
- AddTraitLangItem , // 4
45
- SubTraitLangItem , // 5
46
- MulTraitLangItem , // 6
47
- DivTraitLangItem , // 7
48
- RemTraitLangItem , // 8
49
- NegTraitLangItem , // 9
50
- NotTraitLangItem , // 10
51
- BitXorTraitLangItem , // 11
52
- BitAndTraitLangItem , // 12
53
- BitOrTraitLangItem , // 13
54
- ShlTraitLangItem , // 14
55
- ShrTraitLangItem , // 15
56
- IndexTraitLangItem , // 16
57
-
58
- EqTraitLangItem , // 17
59
- OrdTraitLangItem , // 18
60
-
61
- StrEqFnLangItem , // 19
62
- UniqStrEqFnLangItem , // 20
63
- FailFnLangItem , // 21
64
- FailBoundsCheckFnLangItem , // 22
65
- ExchangeMallocFnLangItem , // 23
66
- ClosureExchangeMallocFnLangItem , // 24
67
- ExchangeFreeFnLangItem , // 25
68
- MallocFnLangItem , // 26
69
- FreeFnLangItem , // 27
70
- BorrowAsImmFnLangItem , // 28
71
- BorrowAsMutFnLangItem , // 29
72
- ReturnToMutFnLangItem , // 30
73
- CheckNotBorrowedFnLangItem , // 31
74
- StrDupUniqFnLangItem , // 32
75
- RecordBorrowFnLangItem , // 33
76
- UnrecordBorrowFnLangItem , // 34
77
-
78
- StartFnLangItem , // 35
79
-
80
- TyDescStructLangItem , // 36
81
- TyVisitorTraitLangItem , // 37
82
- OpaqueStructLangItem , // 38
83
-
84
- EventLoopFactoryLangItem , // 39
85
-
86
- TypeIdLangItem , // 40
46
+ $( $variant) ,*
87
47
}
88
48
89
49
pub struct LanguageItems {
90
- items : [ Option < ast:: DefId > , ..41 ]
50
+ items: [ Option <ast:: DefId >, ..$num_lang_items ]
91
51
}
92
52
93
53
impl LanguageItems {
94
54
pub fn new( ) -> LanguageItems {
95
55
LanguageItems {
96
- items : [ None , ..41 ]
56
+ items: [ None , ..$num_lang_items ]
97
57
}
98
58
}
99
59
@@ -103,61 +63,11 @@ impl LanguageItems {
103
63
104
64
pub fn item_name( index: uint) -> & ' static str {
105
65
match index {
106
- 0 => "freeze" ,
107
- 1 => "send" ,
108
- 2 => "sized" ,
109
-
110
- 3 => "drop" ,
111
-
112
- 4 => "add" ,
113
- 5 => "sub" ,
114
- 6 => "mul" ,
115
- 7 => "div" ,
116
- 8 => "rem" ,
117
- 9 => "neg" ,
118
- 10 => "not" ,
119
- 11 => "bitxor" ,
120
- 12 => "bitand" ,
121
- 13 => "bitor" ,
122
- 14 => "shl" ,
123
- 15 => "shr" ,
124
- 16 => "index" ,
125
- 17 => "eq" ,
126
- 18 => "ord" ,
127
-
128
- 19 => "str_eq" ,
129
- 20 => "uniq_str_eq" ,
130
- 21 => "fail_" ,
131
- 22 => "fail_bounds_check" ,
132
- 23 => "exchange_malloc" ,
133
- 24 => "closure_exchange_malloc" ,
134
- 25 => "exchange_free" ,
135
- 26 => "malloc" ,
136
- 27 => "free" ,
137
- 28 => "borrow_as_imm" ,
138
- 29 => "borrow_as_mut" ,
139
- 30 => "return_to_mut" ,
140
- 31 => "check_not_borrowed" ,
141
- 32 => "strdup_uniq" ,
142
- 33 => "record_borrow" ,
143
- 34 => "unrecord_borrow" ,
144
-
145
- 35 => "start" ,
146
-
147
- 36 => "ty_desc" ,
148
- 37 => "ty_visitor" ,
149
- 38 => "opaque" ,
150
-
151
- 39 => "event_loop_factory" ,
152
-
153
- 40 => "type_id" ,
154
-
66
+ $( $num => $name, ) *
155
67
_ => "???"
156
68
}
157
69
}
158
70
159
- // FIXME #4621: Method macros sure would be nice here.
160
-
161
71
pub fn require( & self , it: LangItem ) -> Result <ast:: DefId , ~str > {
162
72
match self . items[ it as uint] {
163
73
Some ( id) => Ok ( id) ,
@@ -178,133 +88,11 @@ impl LanguageItems {
178
88
}
179
89
}
180
90
181
- pub fn freeze_trait ( & self ) -> Option < ast:: DefId > {
182
- self . items [ FreezeTraitLangItem as uint ]
183
- }
184
- pub fn send_trait ( & self ) -> Option < ast:: DefId > {
185
- self . items [ SendTraitLangItem as uint ]
186
- }
187
- pub fn sized_trait ( & self ) -> Option < ast:: DefId > {
188
- self . items [ SizedTraitLangItem as uint ]
189
- }
190
-
191
- pub fn drop_trait ( & self ) -> Option < ast:: DefId > {
192
- self . items [ DropTraitLangItem as uint ]
193
- }
194
-
195
- pub fn add_trait ( & self ) -> Option < ast:: DefId > {
196
- self . items [ AddTraitLangItem as uint ]
197
- }
198
- pub fn sub_trait ( & self ) -> Option < ast:: DefId > {
199
- self . items [ SubTraitLangItem as uint ]
200
- }
201
- pub fn mul_trait ( & self ) -> Option < ast:: DefId > {
202
- self . items [ MulTraitLangItem as uint ]
203
- }
204
- pub fn div_trait ( & self ) -> Option < ast:: DefId > {
205
- self . items [ DivTraitLangItem as uint ]
206
- }
207
- pub fn rem_trait ( & self ) -> Option < ast:: DefId > {
208
- self . items [ RemTraitLangItem as uint ]
209
- }
210
- pub fn neg_trait ( & self ) -> Option < ast:: DefId > {
211
- self . items [ NegTraitLangItem as uint ]
212
- }
213
- pub fn not_trait ( & self ) -> Option < ast:: DefId > {
214
- self . items [ NotTraitLangItem as uint ]
215
- }
216
- pub fn bitxor_trait ( & self ) -> Option < ast:: DefId > {
217
- self . items [ BitXorTraitLangItem as uint ]
218
- }
219
- pub fn bitand_trait ( & self ) -> Option < ast:: DefId > {
220
- self . items [ BitAndTraitLangItem as uint ]
221
- }
222
- pub fn bitor_trait ( & self ) -> Option < ast:: DefId > {
223
- self . items [ BitOrTraitLangItem as uint ]
224
- }
225
- pub fn shl_trait ( & self ) -> Option < ast:: DefId > {
226
- self . items [ ShlTraitLangItem as uint ]
227
- }
228
- pub fn shr_trait ( & self ) -> Option < ast:: DefId > {
229
- self . items [ ShrTraitLangItem as uint ]
230
- }
231
- pub fn index_trait ( & self ) -> Option < ast:: DefId > {
232
- self . items [ IndexTraitLangItem as uint ]
233
- }
234
-
235
- pub fn eq_trait ( & self ) -> Option < ast:: DefId > {
236
- self . items [ EqTraitLangItem as uint ]
237
- }
238
- pub fn ord_trait ( & self ) -> Option < ast:: DefId > {
239
- self . items [ OrdTraitLangItem as uint ]
240
- }
241
-
242
- pub fn str_eq_fn ( & self ) -> Option < ast:: DefId > {
243
- self . items [ StrEqFnLangItem as uint ]
244
- }
245
- pub fn uniq_str_eq_fn ( & self ) -> Option < ast:: DefId > {
246
- self . items [ UniqStrEqFnLangItem as uint ]
247
- }
248
- pub fn fail_fn ( & self ) -> Option < ast:: DefId > {
249
- self . items [ FailFnLangItem as uint ]
250
- }
251
- pub fn fail_bounds_check_fn ( & self ) -> Option < ast:: DefId > {
252
- self . items [ FailBoundsCheckFnLangItem as uint ]
253
- }
254
- pub fn exchange_malloc_fn ( & self ) -> Option < ast:: DefId > {
255
- self . items [ ExchangeMallocFnLangItem as uint ]
256
- }
257
- pub fn closure_exchange_malloc_fn ( & self ) -> Option < ast:: DefId > {
258
- self . items [ ClosureExchangeMallocFnLangItem as uint ]
259
- }
260
- pub fn exchange_free_fn ( & self ) -> Option < ast:: DefId > {
261
- self . items [ ExchangeFreeFnLangItem as uint ]
262
- }
263
- pub fn malloc_fn ( & self ) -> Option < ast:: DefId > {
264
- self . items [ MallocFnLangItem as uint ]
265
- }
266
- pub fn free_fn ( & self ) -> Option < ast:: DefId > {
267
- self . items [ FreeFnLangItem as uint ]
268
- }
269
- pub fn borrow_as_imm_fn ( & self ) -> Option < ast:: DefId > {
270
- self . items [ BorrowAsImmFnLangItem as uint ]
271
- }
272
- pub fn borrow_as_mut_fn ( & self ) -> Option < ast:: DefId > {
273
- self . items [ BorrowAsMutFnLangItem as uint ]
274
- }
275
- pub fn return_to_mut_fn ( & self ) -> Option < ast:: DefId > {
276
- self . items [ ReturnToMutFnLangItem as uint ]
277
- }
278
- pub fn check_not_borrowed_fn ( & self ) -> Option < ast:: DefId > {
279
- self . items [ CheckNotBorrowedFnLangItem as uint ]
280
- }
281
- pub fn strdup_uniq_fn ( & self ) -> Option < ast:: DefId > {
282
- self . items [ StrDupUniqFnLangItem as uint ]
283
- }
284
- pub fn record_borrow_fn ( & self ) -> Option < ast:: DefId > {
285
- self . items [ RecordBorrowFnLangItem as uint ]
286
- }
287
- pub fn unrecord_borrow_fn ( & self ) -> Option < ast:: DefId > {
288
- self . items [ UnrecordBorrowFnLangItem as uint ]
289
- }
290
- pub fn start_fn ( & self ) -> Option < ast:: DefId > {
291
- self . items [ StartFnLangItem as uint ]
292
- }
293
- pub fn ty_desc ( & self ) -> Option < ast:: DefId > {
294
- self . items [ TyDescStructLangItem as uint ]
295
- }
296
- pub fn ty_visitor ( & self ) -> Option < ast:: DefId > {
297
- self . items [ TyVisitorTraitLangItem as uint ]
298
- }
299
- pub fn opaque ( & self ) -> Option < ast:: DefId > {
300
- self . items [ OpaqueStructLangItem as uint ]
301
- }
302
- pub fn event_loop_factory ( & self ) -> Option < ast:: DefId > {
303
- self . items [ EventLoopFactoryLangItem as uint ]
304
- }
305
- pub fn type_id ( & self ) -> Option < ast:: DefId > {
306
- self . items [ TypeIdLangItem as uint ]
307
- }
91
+ $(
92
+ pub fn $method( & self ) -> Option <ast:: DefId > {
93
+ self . items[ $variant as uint]
94
+ }
95
+ ) *
308
96
}
309
97
310
98
struct LanguageItemCollector {
@@ -343,53 +131,7 @@ impl LanguageItemCollector {
343
131
pub fn new( session: Session ) -> LanguageItemCollector {
344
132
let mut item_refs = HashMap :: new( ) ;
345
133
346
- item_refs. insert ( "freeze" , FreezeTraitLangItem as uint ) ;
347
- item_refs. insert ( "send" , SendTraitLangItem as uint ) ;
348
- item_refs. insert ( "sized" , SizedTraitLangItem as uint ) ;
349
-
350
- item_refs. insert ( "drop" , DropTraitLangItem as uint ) ;
351
-
352
- item_refs. insert ( "add" , AddTraitLangItem as uint ) ;
353
- item_refs. insert ( "sub" , SubTraitLangItem as uint ) ;
354
- item_refs. insert ( "mul" , MulTraitLangItem as uint ) ;
355
- item_refs. insert ( "div" , DivTraitLangItem as uint ) ;
356
- item_refs. insert ( "rem" , RemTraitLangItem as uint ) ;
357
- item_refs. insert ( "neg" , NegTraitLangItem as uint ) ;
358
- item_refs. insert ( "not" , NotTraitLangItem as uint ) ;
359
- item_refs. insert ( "bitxor" , BitXorTraitLangItem as uint ) ;
360
- item_refs. insert ( "bitand" , BitAndTraitLangItem as uint ) ;
361
- item_refs. insert ( "bitor" , BitOrTraitLangItem as uint ) ;
362
- item_refs. insert ( "shl" , ShlTraitLangItem as uint ) ;
363
- item_refs. insert ( "shr" , ShrTraitLangItem as uint ) ;
364
- item_refs. insert ( "index" , IndexTraitLangItem as uint ) ;
365
-
366
- item_refs. insert ( "eq" , EqTraitLangItem as uint ) ;
367
- item_refs. insert ( "ord" , OrdTraitLangItem as uint ) ;
368
-
369
- item_refs. insert ( "str_eq" , StrEqFnLangItem as uint ) ;
370
- item_refs. insert ( "uniq_str_eq" , UniqStrEqFnLangItem as uint ) ;
371
- item_refs. insert ( "fail_" , FailFnLangItem as uint ) ;
372
- item_refs. insert ( "fail_bounds_check" ,
373
- FailBoundsCheckFnLangItem as uint ) ;
374
- item_refs. insert ( "exchange_malloc" , ExchangeMallocFnLangItem as uint ) ;
375
- item_refs. insert ( "closure_exchange_malloc" , ClosureExchangeMallocFnLangItem as uint ) ;
376
- item_refs. insert ( "exchange_free" , ExchangeFreeFnLangItem as uint ) ;
377
- item_refs. insert ( "malloc" , MallocFnLangItem as uint ) ;
378
- item_refs. insert ( "free" , FreeFnLangItem as uint ) ;
379
- item_refs. insert ( "borrow_as_imm" , BorrowAsImmFnLangItem as uint ) ;
380
- item_refs. insert ( "borrow_as_mut" , BorrowAsMutFnLangItem as uint ) ;
381
- item_refs. insert ( "return_to_mut" , ReturnToMutFnLangItem as uint ) ;
382
- item_refs. insert ( "check_not_borrowed" ,
383
- CheckNotBorrowedFnLangItem as uint ) ;
384
- item_refs. insert ( "strdup_uniq" , StrDupUniqFnLangItem as uint ) ;
385
- item_refs. insert ( "record_borrow" , RecordBorrowFnLangItem as uint ) ;
386
- item_refs. insert ( "unrecord_borrow" , UnrecordBorrowFnLangItem as uint ) ;
387
- item_refs. insert ( "start" , StartFnLangItem as uint ) ;
388
- item_refs. insert ( "ty_desc" , TyDescStructLangItem as uint ) ;
389
- item_refs. insert ( "ty_visitor" , TyVisitorTraitLangItem as uint ) ;
390
- item_refs. insert ( "opaque" , OpaqueStructLangItem as uint ) ;
391
- item_refs. insert ( "event_loop_factory" , EventLoopFactoryLangItem as uint ) ;
392
- item_refs. insert ( "type_id" , TypeIdLangItem as uint ) ;
134
+ $( item_refs. insert( $name, $variant as uint) ; ) *
393
135
394
136
LanguageItemCollector {
395
137
session: session,
@@ -458,3 +200,62 @@ pub fn collect_language_items(crate: &ast::Crate,
458
200
session. abort_if_errors( ) ;
459
201
items
460
202
}
203
+
204
+ // End of the macro
205
+ }
206
+ }
207
+
208
+ lets_do_this ! {
209
+ There are 41 lang items.
210
+
211
+ // ID, Variant name, Name, Method name;
212
+ 0 , FreezeTraitLangItem , "freeze" , freeze_trait;
213
+ 1 , SendTraitLangItem , "send" , send_trait;
214
+ 2 , SizedTraitLangItem , "sized" , sized_trait;
215
+
216
+ 3 , DropTraitLangItem , "drop" , drop_trait;
217
+
218
+ 4 , AddTraitLangItem , "add" , add_trait;
219
+ 5 , SubTraitLangItem , "sub" , sub_trait;
220
+ 6 , MulTraitLangItem , "mul" , mul_trait;
221
+ 7 , DivTraitLangItem , "div" , div_trait;
222
+ 8 , RemTraitLangItem , "rem" , rem_trait;
223
+ 9 , NegTraitLangItem , "neg" , neg_trait;
224
+ 10 , NotTraitLangItem , "not" , not_trait;
225
+ 11 , BitXorTraitLangItem , "bitxor" , bitxor_trait;
226
+ 12 , BitAndTraitLangItem , "bitand" , bitand_trait;
227
+ 13 , BitOrTraitLangItem , "bitor" , bitor_trait;
228
+ 14 , ShlTraitLangItem , "shl" , shl_trait;
229
+ 15 , ShrTraitLangItem , "shr" , shr_trait;
230
+ 16 , IndexTraitLangItem , "index" , index_trait;
231
+
232
+ 17 , EqTraitLangItem , "eq" , eq_trait;
233
+ 18 , OrdTraitLangItem , "ord" , ord_trait;
234
+
235
+ 19 , StrEqFnLangItem , "str_eq" , str_eq_fn;
236
+ 20 , UniqStrEqFnLangItem , "uniq_str_eq" , uniq_str_eq_fn;
237
+ 21 , FailFnLangItem , "fail_" , fail_fn;
238
+ 22 , FailBoundsCheckFnLangItem , "fail_bounds_check" , fail_bounds_check_fn;
239
+ 23 , ExchangeMallocFnLangItem , "exchange_malloc" , exchange_malloc_fn;
240
+ 24 , ClosureExchangeMallocFnLangItem , "closure_exchange_malloc" , closure_exchange_malloc_fn;
241
+ 25 , ExchangeFreeFnLangItem , "exchange_free" , exchange_free_fn;
242
+ 26 , MallocFnLangItem , "malloc" , malloc_fn;
243
+ 27 , FreeFnLangItem , "free" , free_fn;
244
+ 28 , BorrowAsImmFnLangItem , "borrow_as_imm" , borrow_as_imm_fn;
245
+ 29 , BorrowAsMutFnLangItem , "borrow_as_mut" , borrow_as_mut_fn;
246
+ 30 , ReturnToMutFnLangItem , "return_to_mut" , return_to_mut_fn;
247
+ 31 , CheckNotBorrowedFnLangItem , "check_not_borrowed" , check_not_borrowed_fn;
248
+ 32 , StrDupUniqFnLangItem , "strdup_uniq" , strdup_uniq_fn;
249
+ 33 , RecordBorrowFnLangItem , "record_borrow" , record_borrow_fn;
250
+ 34 , UnrecordBorrowFnLangItem , "unrecord_borrow" , unrecord_borrow_fn;
251
+
252
+ 35 , StartFnLangItem , "start" , start_fn;
253
+
254
+ 36 , TyDescStructLangItem , "ty_desc" , ty_desc;
255
+ 37 , TyVisitorTraitLangItem , "ty_visitor" , ty_visitor;
256
+ 38 , OpaqueStructLangItem , "opaque" , opaque;
257
+
258
+ 39 , EventLoopFactoryLangItem , "event_loop_factory" , event_loop_factory;
259
+
260
+ 40 , TypeIdLangItem , "type_id" , type_id;
261
+ }
0 commit comments