@@ -16,13 +16,15 @@ use rustc_middle::hir::map::Map;
1616use rustc_middle:: middle:: privacy:: AccessLevels ;
1717use rustc_middle:: ty:: { ParamEnv , Ty , TyCtxt } ;
1818use rustc_resolve as resolve;
19+ use rustc_resolve:: Namespace :: TypeNS ;
1920use rustc_session:: config:: { self , CrateType , ErrorOutputType } ;
2021use rustc_session:: lint;
2122use rustc_session:: DiagnosticOutput ;
2223use rustc_session:: Session ;
24+ use rustc_span:: def_id:: CRATE_DEF_INDEX ;
2325use rustc_span:: source_map;
2426use rustc_span:: symbol:: sym;
25- use rustc_span:: Span ;
27+ use rustc_span:: { Span , DUMMY_SP } ;
2628
2729use std:: cell:: RefCell ;
2830use std:: lazy:: SyncLazy ;
@@ -299,13 +301,43 @@ crate fn create_config(
299301}
300302
301303crate fn create_resolver < ' a > (
304+ externs : config:: Externs ,
302305 queries : & Queries < ' a > ,
303306 sess : & Session ,
304307) -> Rc < RefCell < interface:: BoxedResolver > > {
305308 let ( krate, resolver, _) = & * abort_on_err ( queries. expansion ( ) , sess) . peek ( ) ;
306309 let resolver = resolver. clone ( ) ;
307310
308- crate :: passes:: collect_intra_doc_links:: load_intra_link_crates ( resolver, krate)
311+ let resolver = crate :: passes:: collect_intra_doc_links:: load_intra_link_crates ( resolver, krate) ;
312+
313+ // FIXME: somehow rustdoc is still missing crates even though we loaded all
314+ // the known necessary crates. Load them all unconditionally until we find a way to fix this.
315+ // DO NOT REMOVE THIS without first testing on the reproducer in
316+ // https://github.com/jyn514/objr/commit/edcee7b8124abf0e4c63873e8422ff81beb11ebb
317+ let extern_names: Vec < String > = externs
318+ . iter ( )
319+ . filter ( |( _, entry) | entry. add_prelude )
320+ . map ( |( name, _) | name)
321+ . cloned ( )
322+ . collect ( ) ;
323+ resolver. borrow_mut ( ) . access ( |resolver| {
324+ sess. time ( "load_extern_crates" , || {
325+ for extern_name in & extern_names {
326+ debug ! ( "loading extern crate {}" , extern_name) ;
327+ if let Err ( ( ) ) = resolver
328+ . resolve_str_path_error (
329+ DUMMY_SP ,
330+ extern_name,
331+ TypeNS ,
332+ LocalDefId { local_def_index : CRATE_DEF_INDEX } . to_def_id ( ) ,
333+ ) {
334+ warn ! ( "unable to resolve external crate {} (do you have an unused `--extern` crate?)" , extern_name)
335+ }
336+ }
337+ } ) ;
338+ } ) ;
339+
340+ resolver
309341}
310342
311343crate fn run_global_ctxt (
0 commit comments