@@ -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