Skip to content

Commit 34e8b0a

Browse files
committed
Separate create_resolver into a new function
1 parent 0ac58f7 commit 34e8b0a

File tree

1 file changed

+43
-36
lines changed

1 file changed

+43
-36
lines changed

src/librustdoc/core.rs

+43-36
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use rustc_hir::{
1111
intravisit::{self, NestedVisitorMap, Visitor},
1212
Path,
1313
};
14-
use rustc_interface::interface;
14+
use rustc_interface::{interface, Queries};
1515
use rustc_middle::hir::map::Map;
1616
use rustc_middle::middle::privacy::AccessLevels;
1717
use rustc_middle::ty::{ParamEnv, Ty, TyCtxt};
@@ -409,16 +409,10 @@ fn create_config(
409409
crate fn run_core(
410410
options: RustdocOptions,
411411
) -> (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();
419412
let default_passes = options.default_passes;
420413
let output_format = options.output_format;
421414
// TODO: fix this clone (especially render_options)
415+
let externs = options.externs.clone();
422416
let manual_passes = options.manual_passes.clone();
423417
let render_options = options.render_options.clone();
424418
let config = create_config(options);
@@ -430,34 +424,7 @@ crate fn run_core(
430424
// We need to hold on to the complete resolver, so we cause everything to be
431425
// cloned for the analysis passes to use. Suboptimal, but necessary in the
432426
// 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);
461428

462429
if sess.has_errors() {
463430
sess.fatal("Compilation failed, aborting rustdoc");
@@ -482,6 +449,46 @@ crate fn run_core(
482449
})
483450
}
484451

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+
485492
fn run_global_ctxt(
486493
tcx: TyCtxt<'_>,
487494
resolver: Rc<RefCell<interface::BoxedResolver>>,

0 commit comments

Comments
 (0)