Auto merge of #80090 - jyn514:tcx-in-render, r=GuillaumeGomez · rust-lang/rust@d8d3ab9 (original) (raw)
`@@ -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:🔏: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) {
`
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 = 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<RefCellinterface::BoxedResolver> {
`
``
414
`+
let extern_names: Vec = 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<RefCellinterface::BoxedResolver>,
`
484
452
`mut default_passes: passes::DefaultPassOption,
`