Skip to content

Commit d8d3ab9

Browse files
committed
Auto merge of rust-lang#80090 - jyn514:tcx-in-render, r=GuillaumeGomez
Pass a `TyCtxt` through to `FormatRender` This is the next step after rust-lang#79957 for rust-lang#76382. Eventually I plan to use this to remove `stability`, `const_stability`, and `deprecation` from `Item`, but that needs more extensive changes (in particular, rust-lang#75355 or something like it). This has no actual changes to behavior, it's just moving types around. ccc rust-lang#80014 (comment)
2 parents fee693d + 0c2f76a commit d8d3ab9

File tree

7 files changed

+226
-179
lines changed

7 files changed

+226
-179
lines changed

src/librustdoc/core.rs

+45-77
Original file line numberDiff line numberDiff line change
@@ -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};
1515
use rustc_middle::hir::map::Map;
1616
use rustc_middle::middle::privacy::AccessLevels;
1717
use 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,

src/librustdoc/formats/renderer.rs

+6-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use std::sync::Arc;
22

3-
use rustc_data_structures::sync::Lrc;
4-
use rustc_session::Session;
3+
use rustc_middle::ty;
54
use rustc_span::edition::Edition;
65

76
use crate::clean;
@@ -12,7 +11,7 @@ use crate::formats::cache::{Cache, CACHE_KEY};
1211
/// Allows for different backends to rustdoc to be used with the `run_format()` function. Each
1312
/// backend renderer has hooks for initialization, documenting an item, entering and exiting a
1413
/// module, and cleanup/finalizing output.
15-
crate trait FormatRenderer: Clone {
14+
crate trait FormatRenderer<'tcx>: Clone {
1615
/// Sets up any state required for the renderer. When this is called the cache has already been
1716
/// populated.
1817
fn init(
@@ -21,7 +20,7 @@ crate trait FormatRenderer: Clone {
2120
render_info: RenderInfo,
2221
edition: Edition,
2322
cache: &mut Cache,
24-
sess: Lrc<Session>,
23+
tcx: ty::TyCtxt<'tcx>,
2524
) -> Result<(Self, clean::Crate), Error>;
2625

2726
/// Renders a single non-module item. This means no recursive sub-item rendering is required.
@@ -46,13 +45,13 @@ crate trait FormatRenderer: Clone {
4645
}
4746

4847
/// Main method for rendering a crate.
49-
crate fn run_format<T: FormatRenderer>(
48+
crate fn run_format<'tcx, T: FormatRenderer<'tcx>>(
5049
krate: clean::Crate,
5150
options: RenderOptions,
5251
render_info: RenderInfo,
5352
diag: &rustc_errors::Handler,
5453
edition: Edition,
55-
sess: Lrc<Session>,
54+
tcx: ty::TyCtxt<'tcx>,
5655
) -> Result<(), Error> {
5756
let (krate, mut cache) = Cache::from_krate(
5857
render_info.clone(),
@@ -63,7 +62,7 @@ crate fn run_format<T: FormatRenderer>(
6362
);
6463

6564
let (mut format_renderer, mut krate) =
66-
T::init(krate, options, render_info, edition, &mut cache, sess)?;
65+
T::init(krate, options, render_info, edition, &mut cache, tcx)?;
6766

6867
let cache = Arc::new(cache);
6968
// Freeze the cache now that the index has been built. Put an Arc into TLS for future

0 commit comments

Comments
 (0)