mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-16 17:03:35 +00:00
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.
This commit is contained in:
commit
aa4455e4c7
@ -34,66 +34,26 @@ use std::hashmap::HashMap;
|
|||||||
use std::iter::Enumerate;
|
use std::iter::Enumerate;
|
||||||
use std::vec;
|
use std::vec;
|
||||||
|
|
||||||
|
// The actual lang items defined come at the end of this file in one handy table.
|
||||||
|
// So you probably just want to nip down to the end.
|
||||||
|
macro_rules! lets_do_this {
|
||||||
|
(
|
||||||
|
There are $num_lang_items:expr lang items.
|
||||||
|
$( $num:pat, $variant:ident, $name:expr, $method:ident; )*
|
||||||
|
) => {
|
||||||
|
|
||||||
pub enum LangItem {
|
pub enum LangItem {
|
||||||
FreezeTraitLangItem, // 0
|
$($variant),*
|
||||||
SendTraitLangItem, // 1
|
|
||||||
SizedTraitLangItem, // 2
|
|
||||||
|
|
||||||
DropTraitLangItem, // 3
|
|
||||||
|
|
||||||
AddTraitLangItem, // 4
|
|
||||||
SubTraitLangItem, // 5
|
|
||||||
MulTraitLangItem, // 6
|
|
||||||
DivTraitLangItem, // 7
|
|
||||||
RemTraitLangItem, // 8
|
|
||||||
NegTraitLangItem, // 9
|
|
||||||
NotTraitLangItem, // 10
|
|
||||||
BitXorTraitLangItem, // 11
|
|
||||||
BitAndTraitLangItem, // 12
|
|
||||||
BitOrTraitLangItem, // 13
|
|
||||||
ShlTraitLangItem, // 14
|
|
||||||
ShrTraitLangItem, // 15
|
|
||||||
IndexTraitLangItem, // 16
|
|
||||||
|
|
||||||
EqTraitLangItem, // 17
|
|
||||||
OrdTraitLangItem, // 18
|
|
||||||
|
|
||||||
StrEqFnLangItem, // 19
|
|
||||||
UniqStrEqFnLangItem, // 20
|
|
||||||
FailFnLangItem, // 21
|
|
||||||
FailBoundsCheckFnLangItem, // 22
|
|
||||||
ExchangeMallocFnLangItem, // 23
|
|
||||||
ClosureExchangeMallocFnLangItem, // 24
|
|
||||||
ExchangeFreeFnLangItem, // 25
|
|
||||||
MallocFnLangItem, // 26
|
|
||||||
FreeFnLangItem, // 27
|
|
||||||
BorrowAsImmFnLangItem, // 28
|
|
||||||
BorrowAsMutFnLangItem, // 29
|
|
||||||
ReturnToMutFnLangItem, // 30
|
|
||||||
CheckNotBorrowedFnLangItem, // 31
|
|
||||||
StrDupUniqFnLangItem, // 32
|
|
||||||
RecordBorrowFnLangItem, // 33
|
|
||||||
UnrecordBorrowFnLangItem, // 34
|
|
||||||
|
|
||||||
StartFnLangItem, // 35
|
|
||||||
|
|
||||||
TyDescStructLangItem, // 36
|
|
||||||
TyVisitorTraitLangItem, // 37
|
|
||||||
OpaqueStructLangItem, // 38
|
|
||||||
|
|
||||||
EventLoopFactoryLangItem, // 39
|
|
||||||
|
|
||||||
TypeIdLangItem, // 40
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct LanguageItems {
|
pub struct LanguageItems {
|
||||||
items: [Option<ast::DefId>, ..41]
|
items: [Option<ast::DefId>, ..$num_lang_items]
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LanguageItems {
|
impl LanguageItems {
|
||||||
pub fn new() -> LanguageItems {
|
pub fn new() -> LanguageItems {
|
||||||
LanguageItems {
|
LanguageItems {
|
||||||
items: [ None, ..41 ]
|
items: [ None, ..$num_lang_items ]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,61 +63,11 @@ impl LanguageItems {
|
|||||||
|
|
||||||
pub fn item_name(index: uint) -> &'static str {
|
pub fn item_name(index: uint) -> &'static str {
|
||||||
match index {
|
match index {
|
||||||
0 => "freeze",
|
$( $num => $name, )*
|
||||||
1 => "send",
|
|
||||||
2 => "sized",
|
|
||||||
|
|
||||||
3 => "drop",
|
|
||||||
|
|
||||||
4 => "add",
|
|
||||||
5 => "sub",
|
|
||||||
6 => "mul",
|
|
||||||
7 => "div",
|
|
||||||
8 => "rem",
|
|
||||||
9 => "neg",
|
|
||||||
10 => "not",
|
|
||||||
11 => "bitxor",
|
|
||||||
12 => "bitand",
|
|
||||||
13 => "bitor",
|
|
||||||
14 => "shl",
|
|
||||||
15 => "shr",
|
|
||||||
16 => "index",
|
|
||||||
17 => "eq",
|
|
||||||
18 => "ord",
|
|
||||||
|
|
||||||
19 => "str_eq",
|
|
||||||
20 => "uniq_str_eq",
|
|
||||||
21 => "fail_",
|
|
||||||
22 => "fail_bounds_check",
|
|
||||||
23 => "exchange_malloc",
|
|
||||||
24 => "closure_exchange_malloc",
|
|
||||||
25 => "exchange_free",
|
|
||||||
26 => "malloc",
|
|
||||||
27 => "free",
|
|
||||||
28 => "borrow_as_imm",
|
|
||||||
29 => "borrow_as_mut",
|
|
||||||
30 => "return_to_mut",
|
|
||||||
31 => "check_not_borrowed",
|
|
||||||
32 => "strdup_uniq",
|
|
||||||
33 => "record_borrow",
|
|
||||||
34 => "unrecord_borrow",
|
|
||||||
|
|
||||||
35 => "start",
|
|
||||||
|
|
||||||
36 => "ty_desc",
|
|
||||||
37 => "ty_visitor",
|
|
||||||
38 => "opaque",
|
|
||||||
|
|
||||||
39 => "event_loop_factory",
|
|
||||||
|
|
||||||
40 => "type_id",
|
|
||||||
|
|
||||||
_ => "???"
|
_ => "???"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME #4621: Method macros sure would be nice here.
|
|
||||||
|
|
||||||
pub fn require(&self, it: LangItem) -> Result<ast::DefId, ~str> {
|
pub fn require(&self, it: LangItem) -> Result<ast::DefId, ~str> {
|
||||||
match self.items[it as uint] {
|
match self.items[it as uint] {
|
||||||
Some(id) => Ok(id),
|
Some(id) => Ok(id),
|
||||||
@ -178,133 +88,11 @@ impl LanguageItems {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn freeze_trait(&self) -> Option<ast::DefId> {
|
$(
|
||||||
self.items[FreezeTraitLangItem as uint]
|
pub fn $method(&self) -> Option<ast::DefId> {
|
||||||
}
|
self.items[$variant as uint]
|
||||||
pub fn send_trait(&self) -> Option<ast::DefId> {
|
}
|
||||||
self.items[SendTraitLangItem as uint]
|
)*
|
||||||
}
|
|
||||||
pub fn sized_trait(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[SizedTraitLangItem as uint]
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn drop_trait(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[DropTraitLangItem as uint]
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn add_trait(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[AddTraitLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn sub_trait(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[SubTraitLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn mul_trait(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[MulTraitLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn div_trait(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[DivTraitLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn rem_trait(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[RemTraitLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn neg_trait(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[NegTraitLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn not_trait(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[NotTraitLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn bitxor_trait(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[BitXorTraitLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn bitand_trait(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[BitAndTraitLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn bitor_trait(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[BitOrTraitLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn shl_trait(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[ShlTraitLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn shr_trait(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[ShrTraitLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn index_trait(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[IndexTraitLangItem as uint]
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn eq_trait(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[EqTraitLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn ord_trait(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[OrdTraitLangItem as uint]
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn str_eq_fn(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[StrEqFnLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn uniq_str_eq_fn(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[UniqStrEqFnLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn fail_fn(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[FailFnLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn fail_bounds_check_fn(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[FailBoundsCheckFnLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn exchange_malloc_fn(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[ExchangeMallocFnLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn closure_exchange_malloc_fn(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[ClosureExchangeMallocFnLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn exchange_free_fn(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[ExchangeFreeFnLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn malloc_fn(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[MallocFnLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn free_fn(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[FreeFnLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn borrow_as_imm_fn(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[BorrowAsImmFnLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn borrow_as_mut_fn(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[BorrowAsMutFnLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn return_to_mut_fn(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[ReturnToMutFnLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn check_not_borrowed_fn(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[CheckNotBorrowedFnLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn strdup_uniq_fn(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[StrDupUniqFnLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn record_borrow_fn(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[RecordBorrowFnLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn unrecord_borrow_fn(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[UnrecordBorrowFnLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn start_fn(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[StartFnLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn ty_desc(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[TyDescStructLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn ty_visitor(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[TyVisitorTraitLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn opaque(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[OpaqueStructLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn event_loop_factory(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[EventLoopFactoryLangItem as uint]
|
|
||||||
}
|
|
||||||
pub fn type_id(&self) -> Option<ast::DefId> {
|
|
||||||
self.items[TypeIdLangItem as uint]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct LanguageItemCollector {
|
struct LanguageItemCollector {
|
||||||
@ -343,53 +131,7 @@ impl LanguageItemCollector {
|
|||||||
pub fn new(session: Session) -> LanguageItemCollector {
|
pub fn new(session: Session) -> LanguageItemCollector {
|
||||||
let mut item_refs = HashMap::new();
|
let mut item_refs = HashMap::new();
|
||||||
|
|
||||||
item_refs.insert("freeze", FreezeTraitLangItem as uint);
|
$( item_refs.insert($name, $variant as uint); )*
|
||||||
item_refs.insert("send", SendTraitLangItem as uint);
|
|
||||||
item_refs.insert("sized", SizedTraitLangItem as uint);
|
|
||||||
|
|
||||||
item_refs.insert("drop", DropTraitLangItem as uint);
|
|
||||||
|
|
||||||
item_refs.insert("add", AddTraitLangItem as uint);
|
|
||||||
item_refs.insert("sub", SubTraitLangItem as uint);
|
|
||||||
item_refs.insert("mul", MulTraitLangItem as uint);
|
|
||||||
item_refs.insert("div", DivTraitLangItem as uint);
|
|
||||||
item_refs.insert("rem", RemTraitLangItem as uint);
|
|
||||||
item_refs.insert("neg", NegTraitLangItem as uint);
|
|
||||||
item_refs.insert("not", NotTraitLangItem as uint);
|
|
||||||
item_refs.insert("bitxor", BitXorTraitLangItem as uint);
|
|
||||||
item_refs.insert("bitand", BitAndTraitLangItem as uint);
|
|
||||||
item_refs.insert("bitor", BitOrTraitLangItem as uint);
|
|
||||||
item_refs.insert("shl", ShlTraitLangItem as uint);
|
|
||||||
item_refs.insert("shr", ShrTraitLangItem as uint);
|
|
||||||
item_refs.insert("index", IndexTraitLangItem as uint);
|
|
||||||
|
|
||||||
item_refs.insert("eq", EqTraitLangItem as uint);
|
|
||||||
item_refs.insert("ord", OrdTraitLangItem as uint);
|
|
||||||
|
|
||||||
item_refs.insert("str_eq", StrEqFnLangItem as uint);
|
|
||||||
item_refs.insert("uniq_str_eq", UniqStrEqFnLangItem as uint);
|
|
||||||
item_refs.insert("fail_", FailFnLangItem as uint);
|
|
||||||
item_refs.insert("fail_bounds_check",
|
|
||||||
FailBoundsCheckFnLangItem as uint);
|
|
||||||
item_refs.insert("exchange_malloc", ExchangeMallocFnLangItem as uint);
|
|
||||||
item_refs.insert("closure_exchange_malloc", ClosureExchangeMallocFnLangItem as uint);
|
|
||||||
item_refs.insert("exchange_free", ExchangeFreeFnLangItem as uint);
|
|
||||||
item_refs.insert("malloc", MallocFnLangItem as uint);
|
|
||||||
item_refs.insert("free", FreeFnLangItem as uint);
|
|
||||||
item_refs.insert("borrow_as_imm", BorrowAsImmFnLangItem as uint);
|
|
||||||
item_refs.insert("borrow_as_mut", BorrowAsMutFnLangItem as uint);
|
|
||||||
item_refs.insert("return_to_mut", ReturnToMutFnLangItem as uint);
|
|
||||||
item_refs.insert("check_not_borrowed",
|
|
||||||
CheckNotBorrowedFnLangItem as uint);
|
|
||||||
item_refs.insert("strdup_uniq", StrDupUniqFnLangItem as uint);
|
|
||||||
item_refs.insert("record_borrow", RecordBorrowFnLangItem as uint);
|
|
||||||
item_refs.insert("unrecord_borrow", UnrecordBorrowFnLangItem as uint);
|
|
||||||
item_refs.insert("start", StartFnLangItem as uint);
|
|
||||||
item_refs.insert("ty_desc", TyDescStructLangItem as uint);
|
|
||||||
item_refs.insert("ty_visitor", TyVisitorTraitLangItem as uint);
|
|
||||||
item_refs.insert("opaque", OpaqueStructLangItem as uint);
|
|
||||||
item_refs.insert("event_loop_factory", EventLoopFactoryLangItem as uint);
|
|
||||||
item_refs.insert("type_id", TypeIdLangItem as uint);
|
|
||||||
|
|
||||||
LanguageItemCollector {
|
LanguageItemCollector {
|
||||||
session: session,
|
session: session,
|
||||||
@ -458,3 +200,62 @@ pub fn collect_language_items(crate: &ast::Crate,
|
|||||||
session.abort_if_errors();
|
session.abort_if_errors();
|
||||||
items
|
items
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// End of the macro
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lets_do_this! {
|
||||||
|
There are 41 lang items.
|
||||||
|
|
||||||
|
// ID, Variant name, Name, Method name;
|
||||||
|
0, FreezeTraitLangItem, "freeze", freeze_trait;
|
||||||
|
1, SendTraitLangItem, "send", send_trait;
|
||||||
|
2, SizedTraitLangItem, "sized", sized_trait;
|
||||||
|
|
||||||
|
3, DropTraitLangItem, "drop", drop_trait;
|
||||||
|
|
||||||
|
4, AddTraitLangItem, "add", add_trait;
|
||||||
|
5, SubTraitLangItem, "sub", sub_trait;
|
||||||
|
6, MulTraitLangItem, "mul", mul_trait;
|
||||||
|
7, DivTraitLangItem, "div", div_trait;
|
||||||
|
8, RemTraitLangItem, "rem", rem_trait;
|
||||||
|
9, NegTraitLangItem, "neg", neg_trait;
|
||||||
|
10, NotTraitLangItem, "not", not_trait;
|
||||||
|
11, BitXorTraitLangItem, "bitxor", bitxor_trait;
|
||||||
|
12, BitAndTraitLangItem, "bitand", bitand_trait;
|
||||||
|
13, BitOrTraitLangItem, "bitor", bitor_trait;
|
||||||
|
14, ShlTraitLangItem, "shl", shl_trait;
|
||||||
|
15, ShrTraitLangItem, "shr", shr_trait;
|
||||||
|
16, IndexTraitLangItem, "index", index_trait;
|
||||||
|
|
||||||
|
17, EqTraitLangItem, "eq", eq_trait;
|
||||||
|
18, OrdTraitLangItem, "ord", ord_trait;
|
||||||
|
|
||||||
|
19, StrEqFnLangItem, "str_eq", str_eq_fn;
|
||||||
|
20, UniqStrEqFnLangItem, "uniq_str_eq", uniq_str_eq_fn;
|
||||||
|
21, FailFnLangItem, "fail_", fail_fn;
|
||||||
|
22, FailBoundsCheckFnLangItem, "fail_bounds_check", fail_bounds_check_fn;
|
||||||
|
23, ExchangeMallocFnLangItem, "exchange_malloc", exchange_malloc_fn;
|
||||||
|
24, ClosureExchangeMallocFnLangItem, "closure_exchange_malloc", closure_exchange_malloc_fn;
|
||||||
|
25, ExchangeFreeFnLangItem, "exchange_free", exchange_free_fn;
|
||||||
|
26, MallocFnLangItem, "malloc", malloc_fn;
|
||||||
|
27, FreeFnLangItem, "free", free_fn;
|
||||||
|
28, BorrowAsImmFnLangItem, "borrow_as_imm", borrow_as_imm_fn;
|
||||||
|
29, BorrowAsMutFnLangItem, "borrow_as_mut", borrow_as_mut_fn;
|
||||||
|
30, ReturnToMutFnLangItem, "return_to_mut", return_to_mut_fn;
|
||||||
|
31, CheckNotBorrowedFnLangItem, "check_not_borrowed", check_not_borrowed_fn;
|
||||||
|
32, StrDupUniqFnLangItem, "strdup_uniq", strdup_uniq_fn;
|
||||||
|
33, RecordBorrowFnLangItem, "record_borrow", record_borrow_fn;
|
||||||
|
34, UnrecordBorrowFnLangItem, "unrecord_borrow", unrecord_borrow_fn;
|
||||||
|
|
||||||
|
35, StartFnLangItem, "start", start_fn;
|
||||||
|
|
||||||
|
36, TyDescStructLangItem, "ty_desc", ty_desc;
|
||||||
|
37, TyVisitorTraitLangItem, "ty_visitor", ty_visitor;
|
||||||
|
38, OpaqueStructLangItem, "opaque", opaque;
|
||||||
|
|
||||||
|
39, EventLoopFactoryLangItem, "event_loop_factory", event_loop_factory;
|
||||||
|
|
||||||
|
40, TypeIdLangItem, "type_id", type_id;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user