diff options
| author | Joshua Nelson <jyn514@gmail.com> | 2020-12-11 21:57:48 -0500 |
|---|---|---|
| committer | Joshua Nelson <jyn514@gmail.com> | 2020-12-17 11:36:00 -0500 |
| commit | 79ab333cf0e8b49676cabc7d8bdaa785a688a67a (patch) | |
| tree | 4eb03a29115212cc7ed800e57b27c6f5b8cef8fc /src/librustdoc/lib.rs | |
| parent | 34e8b0aae1fe66e0e0c0f70957cc647361a79ff5 (diff) | |
| download | rust-79ab333cf0e8b49676cabc7d8bdaa785a688a67a.tar.gz rust-79ab333cf0e8b49676cabc7d8bdaa785a688a67a.zip | |
Move `run_renderer` into the main `global_ctxt` closure
Diffstat (limited to 'src/librustdoc/lib.rs')
| -rw-r--r-- | src/librustdoc/lib.rs | 103 |
1 files changed, 78 insertions, 25 deletions
diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs index 24045b4e29d..93c849859ab 100644 --- a/src/librustdoc/lib.rs +++ b/src/librustdoc/lib.rs @@ -63,7 +63,9 @@ use std::env; use std::process; use rustc_data_structures::sync::Lrc; +use rustc_driver::abort_on_err; use rustc_errors::ErrorReported; +use rustc_interface::interface; use rustc_session::config::{make_crate_type_option, ErrorOutputType, RustcOptGroup}; use rustc_session::getopts; use rustc_session::Session; @@ -520,34 +522,85 @@ fn main_options(options: config::Options) -> MainResult { // then generated from the cleaned AST of the crate. This runs all the // plug/cleaning passes. let crate_version = options.crate_version.clone(); + + let default_passes = options.default_passes; let output_format = options.output_format; - let (mut krate, renderinfo, renderopts, sess) = core::run_core(options); + // TODO: fix this clone (especially render_options) + let externs = options.externs.clone(); + let manual_passes = options.manual_passes.clone(); + let render_options = options.render_options.clone(); + let config = core::create_config(options); - info!("finished with rustc"); + interface::create_compiler_and_run(config, |compiler| { + compiler.enter(|queries| { + let sess = compiler.session(); - krate.version = crate_version; + // We need to hold on to the complete resolver, so we cause everything to be + // cloned for the analysis passes to use. Suboptimal, but necessary in the + // current architecture. + let resolver = core::create_resolver(externs, queries, &sess); - if show_coverage { - // if we ran coverage, bail early, we don't need to also generate docs at this point - // (also we didn't load in any of the useful passes) - return Ok(()); - } else if run_check { - // Since we're in "check" mode, no need to generate anything beyond this point. - return Ok(()); - } + if sess.has_errors() { + sess.fatal("Compilation failed, aborting rustdoc"); + } - info!("going to format"); - let (error_format, edition, debugging_options) = diag_opts; - let diag = core::new_handler(error_format, None, &debugging_options); - let sess_time = sess.clone(); - match output_format { - None | Some(config::OutputFormat::Html) => sess_time.time("render_html", || { - run_renderer::<html::render::Context>( - krate, renderopts, renderinfo, &diag, edition, sess, - ) - }), - Some(config::OutputFormat::Json) => sess_time.time("render_json", || { - run_renderer::<json::JsonRenderer>(krate, renderopts, renderinfo, &diag, edition, sess) - }), - } + let mut global_ctxt = abort_on_err(queries.global_ctxt(), sess).take(); + + global_ctxt.enter(|tcx| { + let (mut krate, render_info, render_opts) = sess.time("run_global_ctxt", || { + core::run_global_ctxt( + tcx, + resolver, + default_passes, + manual_passes, + render_options, + output_format, + ) + }); + info!("finished with rustc"); + + if let Some(name) = crate_name { + krate.name = name + } + + krate.version = crate_version; + + if show_coverage { + // if we ran coverage, bail early, we don't need to also generate docs at this point + // (also we didn't load in any of the useful passes) + return Ok(()); + } else if run_check { + // Since we're in "check" mode, no need to generate anything beyond this point. + return Ok(()); + } + + info!("going to format"); + let (error_format, edition, debugging_options) = diag_opts; + let diag = core::new_handler(error_format, None, &debugging_options); + let sess_format = sess.clone(); + match output_format { + None | Some(config::OutputFormat::Html) => sess.time("render_html", || { + run_renderer::<html::render::Context>( + krate, + render_opts, + render_info, + &diag, + edition, + sess_format, + ) + }), + Some(config::OutputFormat::Json) => sess.time("render_json", || { + run_renderer::<json::JsonRenderer>( + krate, + render_opts, + render_info, + &diag, + edition, + sess_format, + ) + }), + } + }) + }) + }) } |
