@@ -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 } ;
@@ -273,12 +273,9 @@ where
273273 ( lint_opts, lint_caps)
274274}
275275
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 {
282279 input,
283280 crate_name,
284281 proc_macro_crate,
@@ -294,21 +291,10 @@ crate fn run_core(
294291 lint_opts,
295292 describe_lints,
296293 lint_cap,
297- default_passes,
298- manual_passes,
299294 display_warnings,
300- render_options,
301- output_format,
302295 ..
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 {
312298 // Add the doc cfg into the doc build.
313299 cfgs. push ( "doc" . to_string ( ) ) ;
314300
@@ -374,7 +360,7 @@ crate fn run_core(
374360 ..Options :: default ( )
375361 } ;
376362
377- let config = interface:: Config {
363+ interface:: Config {
378364 opts : sessopts,
379365 crate_cfg : interface:: parse_cfgspecs ( cfgs) ,
380366 input,
@@ -417,68 +403,50 @@ crate fn run_core(
417403 } ) ,
418404 make_codegen_backend : None ,
419405 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+ }
453408
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 ( ) ;
457420
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+ } ) ;
460441 }
442+ } ) ;
443+ } ) ;
461444
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 ( )
479447}
480448
481- fn run_global_ctxt (
449+ crate fn run_global_ctxt (
482450 tcx : TyCtxt < ' _ > ,
483451 resolver : Rc < RefCell < interface:: BoxedResolver > > ,
484452 mut default_passes : passes:: DefaultPassOption ,
0 commit comments