@@ -46,6 +46,14 @@ enum_from_u32! {
46
46
}
47
47
}
48
48
49
+ impl LangItem {
50
+ fn name( self ) -> & ' static str {
51
+ match self {
52
+ $( $variant => $name, ) *
53
+ }
54
+ }
55
+ }
56
+
49
57
pub struct LanguageItems {
50
58
pub items: Vec <Option <DefId >>,
51
59
pub missing: Vec <LangItem >,
@@ -65,22 +73,8 @@ impl LanguageItems {
65
73
& * self . items
66
74
}
67
75
68
- pub fn item_name( index: usize ) -> & ' static str {
69
- let item: Option <LangItem > = LangItem :: from_u32( index as u32 ) ;
70
- match item {
71
- $( Some ( $variant) => $name, ) *
72
- None => "???"
73
- }
74
- }
75
-
76
76
pub fn require( & self , it: LangItem ) -> Result <DefId , String > {
77
- match self . items[ it as usize ] {
78
- Some ( id) => Ok ( id) ,
79
- None => {
80
- Err ( format!( "requires `{}` lang_item" ,
81
- LanguageItems :: item_name( it as usize ) ) )
82
- }
83
- }
77
+ self . items[ it as usize ] . ok_or( format!( "requires `{}` lang_item" , it. name( ) ) )
84
78
}
85
79
86
80
pub fn fn_trait_kind( & self , id: DefId ) -> Option <ty:: ClosureKind > {
@@ -158,7 +152,7 @@ impl<'a, 'tcx> LanguageItemCollector<'a, 'tcx> {
158
152
// Check for duplicates.
159
153
match self . items. items[ item_index] {
160
154
Some ( original_def_id) if original_def_id != item_def_id => {
161
- let name = LanguageItems :: item_name ( item_index) ;
155
+ let name = LangItem :: from_u32 ( item_index as u32 ) . unwrap ( ) . name ( ) ;
162
156
let mut err = match self . tcx. hir. span_if_local( item_def_id) {
163
157
Some ( span) => struct_span_err!(
164
158
self . tcx. sess,
0 commit comments