@@ -11,7 +11,7 @@ use rustc_hir::{
11
11
intravisit::{self, NestedVisitorMap, Visitor},
12
12
Path,
13
13
};
14
- use rustc_interface::interface;
14
+ use rustc_interface::{ interface, Queries} ;
15
15
use rustc_middle::hir::map::Map;
16
16
use rustc_middle::middle::privacy::AccessLevels;
17
17
use rustc_middle::ty::{ParamEnv, Ty, TyCtxt};
@@ -409,16 +409,10 @@ fn create_config(
409
409
crate fn run_core(
410
410
options: RustdocOptions,
411
411
) -> (clean::Crate, RenderInfo, RenderOptions, Lrc<Session>) {
412
- let extern_names: Vec<String> = options
413
- .externs
414
- .iter()
415
- .filter(|(_, entry)| entry.add_prelude)
416
- .map(|(name, _)| name)
417
- .cloned()
418
- .collect();
419
412
let default_passes = options.default_passes;
420
413
let output_format = options.output_format;
421
414
// TODO: fix this clone (especially render_options)
415
+ let externs = options.externs.clone();
422
416
let manual_passes = options.manual_passes.clone();
423
417
let render_options = options.render_options.clone();
424
418
let config = create_config(options);
@@ -430,34 +424,7 @@ crate fn run_core(
430
424
// We need to hold on to the complete resolver, so we cause everything to be
431
425
// cloned for the analysis passes to use. Suboptimal, but necessary in the
432
426
// current architecture.
433
- let resolver = {
434
- let parts = abort_on_err(queries.expansion(), sess).peek();
435
- let resolver = parts.1.borrow();
436
-
437
- // Before we actually clone it, let's force all the extern'd crates to
438
- // actually be loaded, just in case they're only referred to inside
439
- // intra-doc-links
440
- resolver.borrow_mut().access(|resolver| {
441
- sess.time("load_extern_crates", || {
442
- for extern_name in &extern_names {
443
- debug!("loading extern crate {}", extern_name);
444
- resolver
445
- .resolve_str_path_error(
446
- DUMMY_SP,
447
- extern_name,
448
- TypeNS,
449
- LocalDefId { local_def_index: CRATE_DEF_INDEX }.to_def_id(),
450
- )
451
- .unwrap_or_else(|()| {
452
- panic!("Unable to resolve external crate {}", extern_name)
453
- });
454
- }
455
- });
456
- });
457
-
458
- // Now we're good to clone the resolver because everything should be loaded
459
- resolver.clone()
460
- };
427
+ let resolver = create_resolver(externs, queries, &sess);
461
428
462
429
if sess.has_errors() {
463
430
sess.fatal("Compilation failed, aborting rustdoc");
@@ -482,6 +449,46 @@ crate fn run_core(
482
449
})
483
450
}
484
451
452
+ fn create_resolver<'a>(
453
+ externs: config::Externs,
454
+ queries: &Queries<'a>,
455
+ sess: &Session,
456
+ ) -> Lrc<RefCell<interface::BoxedResolver>> {
457
+ let extern_names: Vec<String> = externs
458
+ .iter()
459
+ .filter(|(_, entry)| entry.add_prelude)
460
+ .map(|(name, _)| name)
461
+ .cloned()
462
+ .collect();
463
+
464
+ let parts = abort_on_err(queries.expansion(), sess).peek();
465
+ let resolver = parts.1.borrow();
466
+
467
+ // Before we actually clone it, let's force all the extern'd crates to
468
+ // actually be loaded, just in case they're only referred to inside
469
+ // intra-doc-links
470
+ resolver.borrow_mut().access(|resolver| {
471
+ sess.time("load_extern_crates", || {
472
+ for extern_name in &extern_names {
473
+ debug!("loading extern crate {}", extern_name);
474
+ resolver
475
+ .resolve_str_path_error(
476
+ DUMMY_SP,
477
+ extern_name,
478
+ TypeNS,
479
+ LocalDefId { local_def_index: CRATE_DEF_INDEX }.to_def_id(),
480
+ )
481
+ .unwrap_or_else(|()| {
482
+ panic!("Unable to resolve external crate {}", extern_name)
483
+ });
484
+ }
485
+ });
486
+ });
487
+
488
+ // Now we're good to clone the resolver because everything should be loaded
489
+ resolver.clone()
490
+ }
491
+
485
492
fn run_global_ctxt(
486
493
tcx: TyCtxt<'_>,
487
494
resolver: Rc<RefCell<interface::BoxedResolver>>,
0 commit comments