Auto merge of #75903 - jyn514:lint-refactor, r=GuillaumeGomez
Warn about unknown or renamed lints in rustdoc Fixes https://github.com/rust-lang/rust/issues/75884. This is best reviewed one commit at a time. r? @GuillaumeGomez Originally I tried to do a much broader refactoring that got rid of `init_lints` altogether. My reasoning is that now the lints aren't being run anymore (after https://github.com/rust-lang/rust/pull/73566), there's no need to ignore them explicitly. But it seems there are still some lints that aren't affected by setting `lint_mod` to a no-op: ``` deny(pub_use_of_private_extern_crate) deny(const_err) warn(unused_imports) ``` (there are possibly more, these are just the ones that failed in the rustdoc test suite). Some of these seem like we really should be warning about, but that's a much larger change and I don't propose to make it here. So for the time being, this just adds the `unknown_lints` and `renamed_or_removed_lints` passes to the list of lints rustdoc warns about.
This commit is contained in:
commit
1f2dd3b56a
@ -83,9 +83,9 @@ pub struct Options {
|
||||
/// Codegen options strings to hand to the compiler.
|
||||
pub codegen_options_strs: Vec<String>,
|
||||
/// Debugging (`-Z`) options to pass to the compiler.
|
||||
pub debugging_options: DebuggingOptions,
|
||||
pub debugging_opts: DebuggingOptions,
|
||||
/// Debugging (`-Z`) options strings to pass to the compiler.
|
||||
pub debugging_options_strs: Vec<String>,
|
||||
pub debugging_opts_strs: Vec<String>,
|
||||
/// The target used to compile the crate against.
|
||||
pub target: TargetTriple,
|
||||
/// Edition used when reading the crate. Defaults to "2015". Also used by default when
|
||||
@ -318,9 +318,9 @@ impl Options {
|
||||
let error_format = config::parse_error_format(&matches, color, json_rendered);
|
||||
|
||||
let codegen_options = build_codegen_options(matches, error_format);
|
||||
let debugging_options = build_debugging_options(matches, error_format);
|
||||
let debugging_opts = build_debugging_options(matches, error_format);
|
||||
|
||||
let diag = new_handler(error_format, None, &debugging_options);
|
||||
let diag = new_handler(error_format, None, &debugging_opts);
|
||||
|
||||
// check for deprecated options
|
||||
check_deprecated_options(&matches, &diag);
|
||||
@ -365,7 +365,7 @@ impl Options {
|
||||
.iter()
|
||||
.map(|s| SearchPath::from_cli_opt(s, error_format))
|
||||
.collect();
|
||||
let externs = parse_externs(&matches, &debugging_options, error_format);
|
||||
let externs = parse_externs(&matches, &debugging_opts, error_format);
|
||||
let extern_html_root_urls = match parse_extern_html_roots(&matches) {
|
||||
Ok(ex) => ex,
|
||||
Err(err) => {
|
||||
@ -546,7 +546,7 @@ impl Options {
|
||||
let persist_doctests = matches.opt_str("persist-doctests").map(PathBuf::from);
|
||||
let test_builder = matches.opt_str("test-builder").map(PathBuf::from);
|
||||
let codegen_options_strs = matches.opt_strs("C");
|
||||
let debugging_options_strs = matches.opt_strs("Z");
|
||||
let debugging_opts_strs = matches.opt_strs("Z");
|
||||
let lib_strs = matches.opt_strs("L");
|
||||
let extern_strs = matches.opt_strs("extern");
|
||||
let runtool = matches.opt_str("runtool");
|
||||
@ -569,8 +569,8 @@ impl Options {
|
||||
cfgs,
|
||||
codegen_options,
|
||||
codegen_options_strs,
|
||||
debugging_options,
|
||||
debugging_options_strs,
|
||||
debugging_opts,
|
||||
debugging_opts_strs,
|
||||
target,
|
||||
edition,
|
||||
maybe_sysroot,
|
||||
|
@ -234,7 +234,7 @@ pub fn new_handler(
|
||||
/// It returns a tuple containing:
|
||||
/// * Vector of tuples of lints' name and their associated "max" level
|
||||
/// * HashMap of lint id with their associated "max" level
|
||||
pub fn init_lints<F>(
|
||||
pub(crate) fn init_lints<F>(
|
||||
mut allowed_lints: Vec<String>,
|
||||
lint_opts: Vec<(String, lint::Level)>,
|
||||
filter_call: F,
|
||||
@ -257,7 +257,7 @@ where
|
||||
.filter_map(|lint| {
|
||||
// Permit feature-gated lints to avoid feature errors when trying to
|
||||
// allow all lints.
|
||||
if lint.name == warnings_lint_name || lint.feature_gate.is_some() {
|
||||
if lint.feature_gate.is_some() || allowed_lints.iter().any(|l| lint.name == l) {
|
||||
None
|
||||
} else {
|
||||
filter_call(lint)
|
||||
@ -294,7 +294,7 @@ pub fn run_core(
|
||||
externs,
|
||||
mut cfgs,
|
||||
codegen_options,
|
||||
debugging_options,
|
||||
debugging_opts,
|
||||
target,
|
||||
edition,
|
||||
maybe_sysroot,
|
||||
@ -328,19 +328,23 @@ pub fn run_core(
|
||||
let private_doc_tests = rustc_lint::builtin::PRIVATE_DOC_TESTS.name;
|
||||
let no_crate_level_docs = rustc_lint::builtin::MISSING_CRATE_LEVEL_DOCS.name;
|
||||
let invalid_codeblock_attributes_name = rustc_lint::builtin::INVALID_CODEBLOCK_ATTRIBUTES.name;
|
||||
let renamed_and_removed_lints = rustc_lint::builtin::RENAMED_AND_REMOVED_LINTS.name;
|
||||
let unknown_lints = rustc_lint::builtin::UNKNOWN_LINTS.name;
|
||||
|
||||
// In addition to those specific lints, we also need to allow those given through
|
||||
// command line, otherwise they'll get ignored and we don't want that.
|
||||
let allowed_lints = vec![
|
||||
let lints_to_show = vec![
|
||||
intra_link_resolution_failure_name.to_owned(),
|
||||
missing_docs.to_owned(),
|
||||
missing_doc_example.to_owned(),
|
||||
private_doc_tests.to_owned(),
|
||||
no_crate_level_docs.to_owned(),
|
||||
invalid_codeblock_attributes_name.to_owned(),
|
||||
renamed_and_removed_lints.to_owned(),
|
||||
unknown_lints.to_owned(),
|
||||
];
|
||||
|
||||
let (lint_opts, lint_caps) = init_lints(allowed_lints, lint_opts, |lint| {
|
||||
let (lint_opts, lint_caps) = init_lints(lints_to_show, lint_opts, |lint| {
|
||||
if lint.name == intra_link_resolution_failure_name
|
||||
|| lint.name == invalid_codeblock_attributes_name
|
||||
{
|
||||
@ -358,13 +362,13 @@ pub fn run_core(
|
||||
search_paths: libs,
|
||||
crate_types,
|
||||
lint_opts: if !display_warnings { lint_opts } else { vec![] },
|
||||
lint_cap: Some(lint_cap.unwrap_or_else(|| lint::Forbid)),
|
||||
lint_cap,
|
||||
cg: codegen_options,
|
||||
externs,
|
||||
target_triple: target,
|
||||
unstable_features: UnstableFeatures::from_environment(),
|
||||
actually_rustdoc: true,
|
||||
debugging_opts: debugging_options,
|
||||
debugging_opts,
|
||||
error_format,
|
||||
edition,
|
||||
describe_lints,
|
||||
|
@ -472,7 +472,7 @@ fn run_renderer<T: formats::FormatRenderer>(
|
||||
}
|
||||
|
||||
fn main_options(options: config::Options) -> MainResult {
|
||||
let diag = core::new_handler(options.error_format, None, &options.debugging_options);
|
||||
let diag = core::new_handler(options.error_format, None, &options.debugging_opts);
|
||||
|
||||
match (options.should_test, options.markdown_input()) {
|
||||
(true, true) => return wrap_return(&diag, markdown::test(options)),
|
||||
@ -488,7 +488,7 @@ fn main_options(options: config::Options) -> MainResult {
|
||||
|
||||
// need to move these items separately because we lose them by the time the closure is called,
|
||||
// but we can't crates the Handler ahead of time because it's not Send
|
||||
let diag_opts = (options.error_format, options.edition, options.debugging_options.clone());
|
||||
let diag_opts = (options.error_format, options.edition, options.debugging_opts.clone());
|
||||
let show_coverage = options.show_coverage;
|
||||
|
||||
// First, parse the crate and extract all relevant information.
|
||||
|
@ -281,7 +281,7 @@ fn run_test(
|
||||
for codegen_options_str in &options.codegen_options_strs {
|
||||
compiler.arg("-C").arg(&codegen_options_str);
|
||||
}
|
||||
for debugging_option_str in &options.debugging_options_strs {
|
||||
for debugging_option_str in &options.debugging_opts_strs {
|
||||
compiler.arg("-Z").arg(&debugging_option_str);
|
||||
}
|
||||
if no_run && !compile_fail {
|
||||
|
8
src/test/rustdoc-ui/unknown-renamed-lints.rs
Normal file
8
src/test/rustdoc-ui/unknown-renamed-lints.rs
Normal file
@ -0,0 +1,8 @@
|
||||
#![deny(unknown_lints)]
|
||||
//~^ NOTE lint level is defined
|
||||
#![deny(renamed_and_removed_lints)]
|
||||
//~^ NOTE lint level is defined
|
||||
#![deny(x)]
|
||||
//~^ ERROR unknown lint
|
||||
#![deny(intra_doc_link_resolution_failure)]
|
||||
//~^ ERROR lint `intra_doc_link_resolution_failure` has been renamed
|
28
src/test/rustdoc-ui/unknown-renamed-lints.stderr
Normal file
28
src/test/rustdoc-ui/unknown-renamed-lints.stderr
Normal file
@ -0,0 +1,28 @@
|
||||
error: unknown lint: `x`
|
||||
--> $DIR/unknown-renamed-lints.rs:5:9
|
||||
|
|
||||
LL | #![deny(x)]
|
||||
| ^
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/unknown-renamed-lints.rs:1:9
|
||||
|
|
||||
LL | #![deny(unknown_lints)]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: lint `intra_doc_link_resolution_failure` has been renamed to `broken_intra_doc_links`
|
||||
--> $DIR/unknown-renamed-lints.rs:7:9
|
||||
|
|
||||
LL | #![deny(intra_doc_link_resolution_failure)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `broken_intra_doc_links`
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/unknown-renamed-lints.rs:3:9
|
||||
|
|
||||
LL | #![deny(renamed_and_removed_lints)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: Compilation failed, aborting rustdoc
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
Loading…
x
Reference in New Issue
Block a user