@@ -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 } ;
@@ -273,12 +273,9 @@ where
273
273
( lint_opts, lint_caps)
274
274
}
275
275
276
- crate fn run_core (
277
- options : RustdocOptions ,
278
- ) -> ( clean:: Crate , RenderInfo , RenderOptions , Lrc < Session > ) {
279
- // Parse, resolve, and typecheck the given crate.
280
-
281
- let RustdocOptions {
276
+ /// Parse, resolve, and typecheck the given crate.
277
+ crate fn create_config (
278
+ RustdocOptions {
282
279
input,
283
280
crate_name,
284
281
proc_macro_crate,
@@ -294,21 +291,10 @@ crate fn run_core(
294
291
lint_opts,
295
292
describe_lints,
296
293
lint_cap,
297
- default_passes,
298
- manual_passes,
299
294
display_warnings,
300
- render_options,
301
- output_format,
302
295
..
303
- } = options;
304
-
305
- let extern_names: Vec < String > = externs
306
- . iter ( )
307
- . filter ( |( _, entry) | entry. add_prelude )
308
- . map ( |( name, _) | name)
309
- . cloned ( )
310
- . collect ( ) ;
311
-
296
+ } : RustdocOptions ,
297
+ ) -> rustc_interface:: Config {
312
298
// Add the doc cfg into the doc build.
313
299
cfgs. push ( "doc" . to_string ( ) ) ;
314
300
@@ -374,7 +360,7 @@ crate fn run_core(
374
360
..Options :: default ( )
375
361
} ;
376
362
377
- let config = interface:: Config {
363
+ interface:: Config {
378
364
opts : sessopts,
379
365
crate_cfg : interface:: parse_cfgspecs ( cfgs) ,
380
366
input,
@@ -417,68 +403,50 @@ crate fn run_core(
417
403
} ) ,
418
404
make_codegen_backend : None ,
419
405
registry : rustc_driver:: diagnostics_registry ( ) ,
420
- } ;
421
-
422
- interface:: create_compiler_and_run ( config, |compiler| {
423
- compiler. enter ( |queries| {
424
- let sess = compiler. session ( ) ;
425
-
426
- // We need to hold on to the complete resolver, so we cause everything to be
427
- // cloned for the analysis passes to use. Suboptimal, but necessary in the
428
- // current architecture.
429
- let resolver = {
430
- let parts = abort_on_err ( queries. expansion ( ) , sess) . peek ( ) ;
431
- let resolver = parts. 1 . borrow ( ) ;
432
-
433
- // Before we actually clone it, let's force all the extern'd crates to
434
- // actually be loaded, just in case they're only referred to inside
435
- // intra-doc-links
436
- resolver. borrow_mut ( ) . access ( |resolver| {
437
- sess. time ( "load_extern_crates" , || {
438
- for extern_name in & extern_names {
439
- debug ! ( "loading extern crate {}" , extern_name) ;
440
- resolver
441
- . resolve_str_path_error (
442
- DUMMY_SP ,
443
- extern_name,
444
- TypeNS ,
445
- LocalDefId { local_def_index : CRATE_DEF_INDEX } . to_def_id ( ) ,
446
- )
447
- . unwrap_or_else ( |( ) | {
448
- panic ! ( "Unable to resolve external crate {}" , extern_name)
449
- } ) ;
450
- }
451
- } ) ;
452
- } ) ;
406
+ }
407
+ }
453
408
454
- // Now we're good to clone the resolver because everything should be loaded
455
- resolver. clone ( )
456
- } ;
409
+ crate fn create_resolver < ' a > (
410
+ externs : config:: Externs ,
411
+ queries : & Queries < ' a > ,
412
+ sess : & Session ,
413
+ ) -> Rc < RefCell < interface:: BoxedResolver > > {
414
+ let extern_names: Vec < String > = externs
415
+ . iter ( )
416
+ . filter ( |( _, entry) | entry. add_prelude )
417
+ . map ( |( name, _) | name)
418
+ . cloned ( )
419
+ . collect ( ) ;
457
420
458
- if sess. has_errors ( ) {
459
- sess. fatal ( "Compilation failed, aborting rustdoc" ) ;
421
+ let parts = abort_on_err ( queries. expansion ( ) , sess) . peek ( ) ;
422
+ let resolver = parts. 1 . borrow ( ) ;
423
+
424
+ // Before we actually clone it, let's force all the extern'd crates to
425
+ // actually be loaded, just in case they're only referred to inside
426
+ // intra-doc-links
427
+ resolver. borrow_mut ( ) . access ( |resolver| {
428
+ sess. time ( "load_extern_crates" , || {
429
+ for extern_name in & extern_names {
430
+ debug ! ( "loading extern crate {}" , extern_name) ;
431
+ resolver
432
+ . resolve_str_path_error (
433
+ DUMMY_SP ,
434
+ extern_name,
435
+ TypeNS ,
436
+ LocalDefId { local_def_index : CRATE_DEF_INDEX } . to_def_id ( ) ,
437
+ )
438
+ . unwrap_or_else ( |( ) | {
439
+ panic ! ( "Unable to resolve external crate {}" , extern_name)
440
+ } ) ;
460
441
}
442
+ } ) ;
443
+ } ) ;
461
444
462
- let mut global_ctxt = abort_on_err ( queries. global_ctxt ( ) , sess) . take ( ) ;
463
-
464
- let ( krate, render_info, opts) = sess. time ( "run_global_ctxt" , || {
465
- global_ctxt. enter ( |tcx| {
466
- run_global_ctxt (
467
- tcx,
468
- resolver,
469
- default_passes,
470
- manual_passes,
471
- render_options,
472
- output_format,
473
- )
474
- } )
475
- } ) ;
476
- ( krate, render_info, opts, Lrc :: clone ( sess) )
477
- } )
478
- } )
445
+ // Now we're good to clone the resolver because everything should be loaded
446
+ resolver. clone ( )
479
447
}
480
448
481
- fn run_global_ctxt (
449
+ crate fn run_global_ctxt (
482
450
tcx : TyCtxt < ' _ > ,
483
451
resolver : Rc < RefCell < interface:: BoxedResolver > > ,
484
452
mut default_passes : passes:: DefaultPassOption ,
0 commit comments