-use rustc::lint;
use rustc::middle::cstore::CrateStore;
use rustc::middle::privacy::AccessLevels;
use rustc::session::config::ErrorOutputType;
use rustc_interface::interface;
use rustc_lint;
use rustc_resolve as resolve;
+use rustc_session::lint;
-use errors::emitter::{Emitter, EmitterWriter};
-use errors::json::JsonEmitter;
+use rustc_errors::emitter::{Emitter, EmitterWriter};
+use rustc_errors::json::JsonEmitter;
use rustc_span::source_map;
use rustc_span::symbol::sym;
use rustc_span::DUMMY_SP;
use crate::config::{Options as RustdocOptions, RenderOptions};
use crate::html::render::RenderInfo;
-use crate::passes;
+use crate::passes::{self, Condition::*, ConditionalPass};
pub use rustc::session::config::{CodegenOptions, DebuggingOptions, Input, Options};
pub use rustc::session::search_paths::SearchPath;
error_format: ErrorOutputType,
source_map: Option<Lrc<source_map::SourceMap>>,
debugging_opts: &DebuggingOptions,
-) -> errors::Handler {
+) -> rustc_errors::Handler {
let emitter: Box<dyn Emitter + sync::Send> = match error_format {
ErrorOutputType::HumanReadable(kind) => {
let (short, color_config) = kind.unzip();
}
};
- errors::Handler::with_emitter_and_flags(emitter, debugging_opts.diagnostic_handler_flags(true))
+ rustc_errors::Handler::with_emitter_and_flags(
+ emitter,
+ debugging_opts.diagnostic_handler_flags(true),
+ )
}
pub fn run_core(options: RustdocOptions) -> (clean::Crate, RenderInfo, RenderOptions) {
describe_lints,
lint_cap,
mut default_passes,
+ mut document_private,
+ document_hidden,
mut manual_passes,
display_warnings,
render_options,
cg: codegen_options,
externs,
target_triple: target,
- // Ensure that rustdoc works even if rustc is feature-staged
- unstable_features: UnstableFeatures::Allow,
+ unstable_features: UnstableFeatures::from_environment(),
actually_rustdoc: true,
debugging_opts: debugging_options,
error_format,
let mut krate = clean::krate(&mut ctxt);
- fn report_deprecated_attr(name: &str, diag: &errors::Handler) {
+ fn report_deprecated_attr(name: &str, diag: &rustc_errors::Handler) {
let mut msg = diag.struct_warn(&format!(
"the `#![doc({})]` attribute is \
considered deprecated",
}
if attr.is_word() && name == sym::document_private_items {
- if default_passes == passes::DefaultPassOption::Default {
- default_passes = passes::DefaultPassOption::Private;
- }
+ document_private = true;
}
}
- let passes = passes::defaults(default_passes).iter().chain(
+ let passes = passes::defaults(default_passes).iter().copied().chain(
manual_passes.into_iter().flat_map(|name| {
if let Some(pass) = passes::find_pass(&name) {
- Some(pass)
+ Some(ConditionalPass::always(pass))
} else {
error!("unknown pass {}, skipping", name);
None
info!("Executing passes");
- for pass in passes {
- debug!("running pass {}", pass.name);
- krate = (pass.pass)(krate, &ctxt);
+ for p in passes {
+ let run = match p.condition {
+ Always => true,
+ WhenDocumentPrivate => document_private,
+ WhenNotDocumentPrivate => !document_private,
+ WhenNotDocumentHidden => !document_hidden,
+ };
+ if run {
+ debug!("running pass {}", p.pass.name);
+ krate = (p.pass.run)(krate, &ctxt);
+ }
}
ctxt.sess().abort_if_errors();