Skip to content

Commit aa4455e

Browse files
committed
auto merge of #10832 : chris-morgan/rust/let's-lop-lang-item-line-count, r=alexcrichton
This should make maintenance of lang items simpler and also reduces the line count by about 201 lines.
2 parents 2eb22ae + 0b1bbc5 commit aa4455e

File tree

1 file changed

+77
-276
lines changed

1 file changed

+77
-276
lines changed

src/librustc/middle/lang_items.rs

+77-276
Original file line numberDiff line numberDiff line change
@@ -34,66 +34,26 @@ use std::hashmap::HashMap;
3434
use std::iter::Enumerate;
3535
use 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+
3745
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),*
8747
}
8848

8949
pub struct LanguageItems {
90-
items: [Option<ast::DefId>, ..41]
50+
items: [Option<ast::DefId>, ..$num_lang_items]
9151
}
9252

9353
impl 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

31098
struct 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

Comments
 (0)