@@ -16,13 +16,15 @@ use rustc_middle::hir::map::Map;
16
16
use rustc_middle:: middle:: privacy:: AccessLevels ;
17
17
use rustc_middle:: ty:: { ParamEnv , Ty , TyCtxt } ;
18
18
use rustc_resolve as resolve;
19
+ use rustc_resolve:: Namespace :: TypeNS ;
19
20
use rustc_session:: config:: { self , CrateType , ErrorOutputType } ;
20
21
use rustc_session:: lint;
21
22
use rustc_session:: DiagnosticOutput ;
22
23
use rustc_session:: Session ;
24
+ use rustc_span:: def_id:: CRATE_DEF_INDEX ;
23
25
use rustc_span:: source_map;
24
26
use rustc_span:: symbol:: sym;
25
- use rustc_span:: Span ;
27
+ use rustc_span:: { Span , DUMMY_SP } ;
26
28
27
29
use std:: cell:: RefCell ;
28
30
use std:: lazy:: SyncLazy ;
@@ -299,13 +301,43 @@ crate fn create_config(
299
301
}
300
302
301
303
crate fn create_resolver < ' a > (
304
+ externs : config:: Externs ,
302
305
queries : & Queries < ' a > ,
303
306
sess : & Session ,
304
307
) -> Rc < RefCell < interface:: BoxedResolver > > {
305
308
let ( krate, resolver, _) = & * abort_on_err ( queries. expansion ( ) , sess) . peek ( ) ;
306
309
let resolver = resolver. clone ( ) ;
307
310
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
309
341
}
310
342
311
343
crate fn run_global_ctxt (
0 commit comments