@@ -722,25 +722,24 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
722
722
& self . raw_proc_macros . unwrap ( ) [ pos]
723
723
}
724
724
725
- fn try_item_ident ( & self , item_index : DefIndex , sess : & Session ) -> Result < Ident , String > {
726
- let name = self
727
- . def_key ( item_index)
728
- . disambiguated_data
729
- . data
730
- . get_opt_name ( )
731
- . ok_or_else ( || format ! ( "Missing opt name for {:?}" , item_index) ) ?;
732
- let span = self
733
- . root
734
- . tables
735
- . ident_span
736
- . get ( self , item_index)
737
- . ok_or_else ( || format ! ( "Missing ident span for {:?} ({:?})" , name, item_index) ) ?
738
- . decode ( ( self , sess) ) ;
739
- Ok ( Ident :: new ( name, span) )
725
+ fn opt_item_ident ( & self , item_index : DefIndex , sess : & Session ) -> Option < Ident > {
726
+ let name = self . def_key ( item_index) . disambiguated_data . data . get_opt_name ( ) ?;
727
+ let span = match self . root . tables . ident_span . get ( self , item_index) {
728
+ Some ( lazy_span) => lazy_span. decode ( ( self , sess) ) ,
729
+ None => {
730
+ // FIXME: this weird case of a name with no span is specific to `extern crate`
731
+ // items, which are supposed to be treated like `use` items and only be encoded
732
+ // to metadata as `Export`s, return `None` because that's what all the callers
733
+ // expect in this case.
734
+ assert_eq ! ( self . def_kind( item_index) , DefKind :: ExternCrate ) ;
735
+ return None ;
736
+ }
737
+ } ;
738
+ Some ( Ident :: new ( name, span) )
740
739
}
741
740
742
741
fn item_ident ( & self , item_index : DefIndex , sess : & Session ) -> Ident {
743
- self . try_item_ident ( item_index, sess) . unwrap ( )
742
+ self . opt_item_ident ( item_index, sess) . expect ( "no encoded ident for item" )
744
743
}
745
744
746
745
fn maybe_kind ( & self , item_id : DefIndex ) -> Option < EntryKind > {
@@ -1102,27 +1101,19 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
1102
1101
// Iterate over all children.
1103
1102
if let Some ( children) = self . root . tables . children . get ( self , id) {
1104
1103
for child_index in children. decode ( ( self , sess) ) {
1105
- // FIXME: Merge with the logic below.
1106
- if let None | Some ( EntryKind :: ForeignMod | EntryKind :: Impl ( _) ) =
1107
- self . maybe_kind ( child_index)
1108
- {
1109
- continue ;
1110
- }
1111
-
1112
- let def_key = self . def_key ( child_index) ;
1113
- if def_key. disambiguated_data . data . get_opt_name ( ) . is_some ( ) {
1114
- let span = self . get_span ( child_index, sess) ;
1104
+ if let Some ( ident) = self . opt_item_ident ( child_index, sess) {
1115
1105
let kind = self . def_kind ( child_index) ;
1116
- let ident = self . item_ident ( child_index, sess) ;
1117
- let vis = self . get_visibility ( child_index) ;
1106
+ if matches ! ( kind, DefKind :: Macro ( ..) ) {
1107
+ // FIXME: Macros are currently encoded twice, once as items and once as
1108
+ // reexports. We ignore the items here and only use the reexports.
1109
+ continue ;
1110
+ }
1118
1111
let def_id = self . local_def_id ( child_index) ;
1119
1112
let res = Res :: Def ( kind, def_id) ;
1113
+ let vis = self . get_visibility ( child_index) ;
1114
+ let span = self . get_span ( child_index, sess) ;
1120
1115
1121
- // FIXME: Macros are currently encoded twice, once as items and once as
1122
- // reexports. We ignore the items here and only use the reexports.
1123
- if !matches ! ( kind, DefKind :: Macro ( ..) ) {
1124
- callback ( Export { res, ident, vis, span } ) ;
1125
- }
1116
+ callback ( Export { ident, res, vis, span } ) ;
1126
1117
1127
1118
// For non-re-export structs and variants add their constructors to children.
1128
1119
// Re-export lists automatically contain constructors when necessary.
0 commit comments