@@ -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 } ;
1515use rustc_middle:: hir:: map:: Map ;
1616use rustc_middle:: middle:: privacy:: AccessLevels ;
1717use rustc_middle:: ty:: { ParamEnv , Ty , TyCtxt } ;
@@ -409,16 +409,10 @@ fn create_config(
409409crate 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+
485492fn run_global_ctxt (
486493 tcx : TyCtxt < ' _ > ,
487494 resolver : Rc < RefCell < interface:: BoxedResolver > > ,
0 commit comments