@@ -14,7 +14,7 @@ use rustc_attr as attr;
14
14
use rustc_data_structures:: fx:: { FxHashMap , FxHashSet } ;
15
15
use rustc_hir as hir;
16
16
use rustc_hir:: def:: { CtorKind , DefKind , Res } ;
17
- use rustc_hir:: def_id:: { CrateNum , DefId , CRATE_DEF_INDEX } ;
17
+ use rustc_hir:: def_id:: { CrateNum , DefId , CRATE_DEF_INDEX , LOCAL_CRATE } ;
18
18
use rustc_index:: vec:: { Idx , IndexVec } ;
19
19
use rustc_infer:: infer:: region_constraints:: { Constraint , RegionConstraintData } ;
20
20
use rustc_middle:: bug;
@@ -229,7 +229,6 @@ impl Clean<Item> for doctree::Module<'_> {
229
229
let attrs = self . attrs . clean ( cx) ;
230
230
231
231
let mut items: Vec < Item > = vec ! [ ] ;
232
- items. extend ( self . extern_crates . iter ( ) . flat_map ( |x| x. clean ( cx) ) ) ;
233
232
items. extend ( self . imports . iter ( ) . flat_map ( |x| x. clean ( cx) ) ) ;
234
233
items. extend ( self . foreigns . iter ( ) . map ( |x| x. clean ( cx) ) ) ;
235
234
items. extend ( self . mods . iter ( ) . map ( |x| x. clean ( cx) ) ) ;
@@ -2004,6 +2003,9 @@ impl Clean<Vec<Item>> for (&hir::Item<'_>, Option<Ident>) {
2004
2003
is_auto : is_auto. clean ( cx) ,
2005
2004
} )
2006
2005
}
2006
+ ItemKind :: ExternCrate ( orig_name) => {
2007
+ return clean_extern_crate ( item, name, orig_name, cx) ;
2008
+ }
2007
2009
_ => unreachable ! ( "not yet converted" ) ,
2008
2010
} ;
2009
2011
@@ -2081,45 +2083,54 @@ fn clean_impl(impl_: &hir::Item<'_>, cx: &DocContext<'_>) -> Vec<Item> {
2081
2083
ret
2082
2084
}
2083
2085
2084
- impl Clean < Vec < Item > > for doctree:: ExternCrate < ' _ > {
2085
- fn clean ( & self , cx : & DocContext < ' _ > ) -> Vec < Item > {
2086
- let please_inline = self . vis . node . is_pub ( )
2087
- && self . attrs . iter ( ) . any ( |a| {
2088
- a. has_name ( sym:: doc)
2089
- && match a. meta_item_list ( ) {
2090
- Some ( l) => attr:: list_contains_name ( & l, sym:: inline) ,
2091
- None => false ,
2092
- }
2093
- } ) ;
2086
+ fn clean_extern_crate (
2087
+ krate : & hir:: Item < ' _ > ,
2088
+ name : Symbol ,
2089
+ orig_name : Option < Symbol > ,
2090
+ cx : & DocContext < ' _ > ,
2091
+ ) -> Vec < Item > {
2092
+ // this is the ID of the `extern crate` statement
2093
+ let def_id = cx. tcx . hir ( ) . local_def_id ( krate. hir_id ) ;
2094
+ let cnum = cx. tcx . extern_mod_stmt_cnum ( def_id) . unwrap_or ( LOCAL_CRATE ) ;
2095
+ // this is the ID of the crate itself
2096
+ let crate_def_id = DefId { krate : cnum, index : CRATE_DEF_INDEX } ;
2097
+ let please_inline = krate. vis . node . is_pub ( )
2098
+ && krate. attrs . iter ( ) . any ( |a| {
2099
+ a. has_name ( sym:: doc)
2100
+ && match a. meta_item_list ( ) {
2101
+ Some ( l) => attr:: list_contains_name ( & l, sym:: inline) ,
2102
+ None => false ,
2103
+ }
2104
+ } ) ;
2094
2105
2095
- if please_inline {
2096
- let mut visited = FxHashSet :: default ( ) ;
2106
+ if please_inline {
2107
+ let mut visited = FxHashSet :: default ( ) ;
2097
2108
2098
- let res = Res :: Def ( DefKind :: Mod , DefId { krate : self . cnum , index : CRATE_DEF_INDEX } ) ;
2109
+ let res = Res :: Def ( DefKind :: Mod , crate_def_id ) ;
2099
2110
2100
- if let Some ( items) = inline:: try_inline (
2101
- cx,
2102
- cx. tcx . parent_module ( self . hir_id ) . to_def_id ( ) ,
2103
- res,
2104
- self . name ,
2105
- Some ( self . attrs ) ,
2106
- & mut visited,
2107
- ) {
2108
- return items;
2109
- }
2111
+ if let Some ( items) = inline:: try_inline (
2112
+ cx,
2113
+ cx. tcx . parent_module ( krate. hir_id ) . to_def_id ( ) ,
2114
+ res,
2115
+ name,
2116
+ Some ( krate. attrs ) ,
2117
+ & mut visited,
2118
+ ) {
2119
+ return items;
2110
2120
}
2111
-
2112
- vec ! [ Item {
2113
- name: None ,
2114
- attrs: self . attrs. clean( cx) ,
2115
- source: self . span. clean( cx) ,
2116
- def_id: DefId { krate: self . cnum, index: CRATE_DEF_INDEX } ,
2117
- visibility: self . vis. clean( cx) ,
2118
- stability: None ,
2119
- deprecation: None ,
2120
- kind: ExternCrateItem ( self . name. clean( cx) , self . path. clone( ) ) ,
2121
- } ]
2122
2121
}
2122
+ let path = orig_name. map ( |x| x. to_string ( ) ) ;
2123
+ // FIXME: using `from_def_id_and_kind` breaks `rustdoc/masked` for some reason
2124
+ vec ! [ Item {
2125
+ name: None ,
2126
+ attrs: krate. attrs. clean( cx) ,
2127
+ source: krate. span. clean( cx) ,
2128
+ def_id: crate_def_id,
2129
+ visibility: krate. vis. clean( cx) ,
2130
+ stability: None ,
2131
+ deprecation: None ,
2132
+ kind: ExternCrateItem ( name. clean( cx) , path) ,
2133
+ } ]
2123
2134
}
2124
2135
2125
2136
impl Clean < Vec < Item > > for doctree:: Import < ' _ > {
0 commit comments