@@ -34,66 +34,26 @@ use std::hashmap::HashMap;
3434use std:: iter:: Enumerate ;
3535use std:: vec;
3636
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+
3745pub 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) ,*
8747}
8848
8949pub struct LanguageItems {
90- items : [ Option < ast:: DefId > , ..41 ]
50+ items: [ Option <ast:: DefId >, ..$num_lang_items ]
9151}
9252
9353impl LanguageItems {
9454 pub fn new( ) -> LanguageItems {
9555 LanguageItems {
96- items : [ None , ..41 ]
56+ items: [ None , ..$num_lang_items ]
9757 }
9858 }
9959
@@ -103,61 +63,11 @@ impl LanguageItems {
10363
10464 pub fn item_name( index: uint) -> & ' static str {
10565 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, ) *
15567 _ => "???"
15668 }
15769 }
15870
159- // FIXME #4621: Method macros sure would be nice here.
160-
16171 pub fn require( & self , it: LangItem ) -> Result <ast:: DefId , ~str > {
16272 match self . items[ it as uint] {
16373 Some ( id) => Ok ( id) ,
@@ -178,133 +88,11 @@ impl LanguageItems {
17888 }
17989 }
18090
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+ ) *
30896}
30997
31098struct LanguageItemCollector {
@@ -343,53 +131,7 @@ impl LanguageItemCollector {
343131 pub fn new( session: Session ) -> LanguageItemCollector {
344132 let mut item_refs = HashMap :: new( ) ;
345133
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) ; ) *
393135
394136 LanguageItemCollector {
395137 session: session,
@@ -458,3 +200,62 @@ pub fn collect_language_items(crate: &ast::Crate,
458200 session. abort_if_errors( ) ;
459201 items
460202}
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