Auto merge of #51382 - GuillaumeGomez:intra-link-lint, r=QuietMisdreavus
Add lint for intra link resolution failure This PR is almost done, just remains this note: ``` note: requested on the command line with `-W intra-link-resolution-failure` ``` I have no idea why my lint is considered as being passed through command line and wasn't able to find where it was set. If anyone has an idea, it'd be very helpful! cc @QuietMisdreavus
This commit is contained in:
commit
0f8f4903f7
11 changed files with 133 additions and 11 deletions
|
@ -298,6 +298,12 @@ declare_lint! {
|
|||
"detects duplicate macro exports"
|
||||
}
|
||||
|
||||
declare_lint! {
|
||||
pub INTRA_DOC_LINK_RESOLUTION_FAILURE,
|
||||
Warn,
|
||||
"warn about documentation intra links resolution failure"
|
||||
}
|
||||
|
||||
/// Does nothing as a lint pass, but registers some `Lint`s
|
||||
/// which are used by other parts of the compiler.
|
||||
#[derive(Copy, Clone)]
|
||||
|
@ -351,6 +357,7 @@ impl LintPass for HardwiredLints {
|
|||
UNSTABLE_NAME_COLLISIONS,
|
||||
DUPLICATE_ASSOCIATED_TYPE_BINDINGS,
|
||||
DUPLICATE_MACRO_EXPORTS,
|
||||
INTRA_DOC_LINK_RESOLUTION_FAILURE,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1665,3 +1665,36 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TrivialConstraints {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Does nothing as a lint pass, but registers some `Lint`s
|
||||
/// which are used by other parts of the compiler.
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct SoftLints;
|
||||
|
||||
impl LintPass for SoftLints {
|
||||
fn get_lints(&self) -> LintArray {
|
||||
lint_array!(
|
||||
WHILE_TRUE,
|
||||
BOX_POINTERS,
|
||||
NON_SHORTHAND_FIELD_PATTERNS,
|
||||
UNSAFE_CODE,
|
||||
MISSING_DOCS,
|
||||
MISSING_COPY_IMPLEMENTATIONS,
|
||||
MISSING_DEBUG_IMPLEMENTATIONS,
|
||||
ANONYMOUS_PARAMETERS,
|
||||
UNUSED_DOC_COMMENTS,
|
||||
UNCONDITIONAL_RECURSION,
|
||||
PLUGIN_AS_LIBRARY,
|
||||
PRIVATE_NO_MANGLE_FNS,
|
||||
PRIVATE_NO_MANGLE_STATICS,
|
||||
NO_MANGLE_CONST_ITEMS,
|
||||
NO_MANGLE_GENERIC_ITEMS,
|
||||
MUTABLE_TRANSMUTES,
|
||||
UNSTABLE_FEATURES,
|
||||
UNIONS_WITH_DROP_FIELDS,
|
||||
UNREACHABLE_PUB,
|
||||
TYPE_ALIAS_BOUNDS,
|
||||
TRIVIAL_BOUNDS,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -60,6 +60,9 @@ use builtin::*;
|
|||
use types::*;
|
||||
use unused::*;
|
||||
|
||||
/// Useful for other parts of the compiler.
|
||||
pub use builtin::SoftLints;
|
||||
|
||||
/// Tell the `LintStore` about all the built-in lints (the ones
|
||||
/// defined in this crate and the ones defined in
|
||||
/// `rustc::lint::builtin`).
|
||||
|
|
|
@ -21,7 +21,7 @@ pub use self::Visibility::{Public, Inherited};
|
|||
|
||||
use syntax;
|
||||
use rustc_target::spec::abi::Abi;
|
||||
use syntax::ast::{self, AttrStyle, Ident};
|
||||
use syntax::ast::{self, AttrStyle, NodeId, Ident};
|
||||
use syntax::attr;
|
||||
use syntax::codemap::{dummy_spanned, Spanned};
|
||||
use syntax::feature_gate::UnstableFeatures;
|
||||
|
@ -46,9 +46,10 @@ use rustc::middle::stability;
|
|||
use rustc::util::nodemap::{FxHashMap, FxHashSet};
|
||||
use rustc_typeck::hir_ty_to_ty;
|
||||
use rustc::infer::region_constraints::{RegionConstraintData, Constraint};
|
||||
use rustc::lint as lint;
|
||||
|
||||
use std::collections::hash_map::Entry;
|
||||
use std::fmt;
|
||||
|
||||
use std::default::Default;
|
||||
use std::{mem, slice, vec};
|
||||
use std::iter::{FromIterator, once};
|
||||
|
@ -1283,10 +1284,16 @@ fn resolution_failure(
|
|||
link_range.end + code_dox_len,
|
||||
);
|
||||
|
||||
diag = cx.sess().struct_span_warn(sp, &msg);
|
||||
diag = cx.tcx.struct_span_lint_node(lint::builtin::INTRA_DOC_LINK_RESOLUTION_FAILURE,
|
||||
NodeId::new(0),
|
||||
sp,
|
||||
&msg);
|
||||
diag.span_label(sp, "cannot be resolved, ignoring");
|
||||
} else {
|
||||
diag = cx.sess().struct_span_warn(sp, &msg);
|
||||
diag = cx.tcx.struct_span_lint_node(lint::builtin::INTRA_DOC_LINK_RESOLUTION_FAILURE,
|
||||
NodeId::new(0),
|
||||
sp,
|
||||
&msg);
|
||||
|
||||
let last_new_line_offset = dox[..link_range.start].rfind('\n').map_or(0, |n| n + 1);
|
||||
let line = dox[last_new_line_offset..].lines().next().unwrap_or("");
|
||||
|
@ -1303,8 +1310,13 @@ fn resolution_failure(
|
|||
}
|
||||
diag
|
||||
} else {
|
||||
cx.sess().struct_span_warn(sp, &msg)
|
||||
cx.tcx.struct_span_lint_node(lint::builtin::INTRA_DOC_LINK_RESOLUTION_FAILURE,
|
||||
NodeId::new(0),
|
||||
sp,
|
||||
&msg)
|
||||
};
|
||||
diag.help("to escape `[` and `]` characters, just add '\\' before them like \
|
||||
`\\[` or `\\]`");
|
||||
diag.emit();
|
||||
}
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ use rustc::middle::cstore::CrateStore;
|
|||
use rustc::middle::privacy::AccessLevels;
|
||||
use rustc::ty::{self, TyCtxt, AllArenas};
|
||||
use rustc::hir::map as hir_map;
|
||||
use rustc::lint;
|
||||
use rustc::lint::{self, LintPass};
|
||||
use rustc::session::config::ErrorOutputType;
|
||||
use rustc::util::nodemap::{FxHashMap, FxHashSet};
|
||||
use rustc_resolve as resolve;
|
||||
|
@ -187,7 +187,20 @@ pub fn run_core(search_paths: SearchPaths,
|
|||
_ => None
|
||||
};
|
||||
|
||||
let warning_lint = lint::builtin::WARNINGS.name_lower();
|
||||
let intra_link_resolution_failure_name = lint::builtin::INTRA_DOC_LINK_RESOLUTION_FAILURE.name;
|
||||
let warnings_lint_name = lint::builtin::WARNINGS.name;
|
||||
let lints = lint::builtin::HardwiredLints.get_lints()
|
||||
.iter()
|
||||
.chain(rustc_lint::SoftLints.get_lints())
|
||||
.filter_map(|lint| {
|
||||
if lint.name == warnings_lint_name ||
|
||||
lint.name == intra_link_resolution_failure_name {
|
||||
None
|
||||
} else {
|
||||
Some((lint.name_lower(), lint::Allow))
|
||||
}
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
let host_triple = TargetTriple::from_triple(config::host_triple());
|
||||
// plays with error output here!
|
||||
|
@ -195,8 +208,12 @@ pub fn run_core(search_paths: SearchPaths,
|
|||
maybe_sysroot,
|
||||
search_paths,
|
||||
crate_types: vec![config::CrateTypeRlib],
|
||||
lint_opts: if !allow_warnings { vec![(warning_lint, lint::Allow)] } else { vec![] },
|
||||
lint_cap: Some(lint::Allow),
|
||||
lint_opts: if !allow_warnings {
|
||||
lints
|
||||
} else {
|
||||
vec![]
|
||||
},
|
||||
lint_cap: Some(lint::Forbid),
|
||||
cg,
|
||||
externs,
|
||||
target_triple: triple.unwrap_or(host_triple),
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
|
||||
#![stable(feature = "rust1", since = "1.0.0")]
|
||||
#![doc(cfg(unix))]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
pub mod io;
|
||||
pub mod ffi;
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
|
||||
#![stable(feature = "rust1", since = "1.0.0")]
|
||||
#![doc(cfg(windows))]
|
||||
#![allow(missing_docs)]
|
||||
|
||||
pub mod ffi;
|
||||
pub mod fs;
|
||||
|
|
14
src/test/rustdoc-ui/deny-intra-link-resolution-failure.rs
Normal file
14
src/test/rustdoc-ui/deny-intra-link-resolution-failure.rs
Normal file
|
@ -0,0 +1,14 @@
|
|||
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![deny(intra_doc_link_resolution_failure)]
|
||||
|
||||
/// [v2] //~ ERROR
|
||||
pub fn foo() {}
|
|
@ -0,0 +1,13 @@
|
|||
error: `[v2]` cannot be resolved, ignoring it...
|
||||
--> $DIR/deny-intra-link-resolution-failure.rs:13:6
|
||||
|
|
||||
13 | /// [v2] //~ ERROR
|
||||
| ^^ cannot be resolved, ignoring
|
||||
|
|
||||
note: lint level defined here
|
||||
--> $DIR/deny-intra-link-resolution-failure.rs:11:9
|
||||
|
|
||||
11 | #![deny(intra_doc_link_resolution_failure)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= help: to escape `[` and `]` characters, just add '/' before them like `/[` or `/]`
|
||||
|
|
@ -3,48 +3,65 @@ warning: `[Foo::baz]` cannot be resolved, ignoring it...
|
|||
|
|
||||
13 | //! Test with [Foo::baz], [Bar::foo], ...
|
||||
| ^^^^^^^^ cannot be resolved, ignoring
|
||||
|
|
||||
= note: #[warn(intra_doc_link_resolution_failure)] on by default
|
||||
= help: to escape `[` and `]` characters, just add '/' before them like `/[` or `/]`
|
||||
|
||||
warning: `[Bar::foo]` cannot be resolved, ignoring it...
|
||||
--> $DIR/intra-links-warning.rs:13:35
|
||||
|
|
||||
13 | //! Test with [Foo::baz], [Bar::foo], ...
|
||||
| ^^^^^^^^ cannot be resolved, ignoring
|
||||
|
|
||||
= help: to escape `[` and `]` characters, just add '/' before them like `/[` or `/]`
|
||||
|
||||
warning: `[Uniooon::X]` cannot be resolved, ignoring it...
|
||||
--> $DIR/intra-links-warning.rs:14:13
|
||||
|
|
||||
14 | //! , [Uniooon::X] and [Qux::Z].
|
||||
| ^^^^^^^^^^ cannot be resolved, ignoring
|
||||
|
|
||||
= help: to escape `[` and `]` characters, just add '/' before them like `/[` or `/]`
|
||||
|
||||
warning: `[Qux::Z]` cannot be resolved, ignoring it...
|
||||
--> $DIR/intra-links-warning.rs:14:30
|
||||
|
|
||||
14 | //! , [Uniooon::X] and [Qux::Z].
|
||||
| ^^^^^^ cannot be resolved, ignoring
|
||||
|
|
||||
= help: to escape `[` and `]` characters, just add '/' before them like `/[` or `/]`
|
||||
|
||||
warning: `[Uniooon::X]` cannot be resolved, ignoring it...
|
||||
--> $DIR/intra-links-warning.rs:16:14
|
||||
|
|
||||
16 | //! , [Uniooon::X] and [Qux::Z].
|
||||
| ^^^^^^^^^^ cannot be resolved, ignoring
|
||||
|
|
||||
= help: to escape `[` and `]` characters, just add '/' before them like `/[` or `/]`
|
||||
|
||||
warning: `[Qux::Z]` cannot be resolved, ignoring it...
|
||||
--> $DIR/intra-links-warning.rs:16:31
|
||||
|
|
||||
16 | //! , [Uniooon::X] and [Qux::Z].
|
||||
| ^^^^^^ cannot be resolved, ignoring
|
||||
|
|
||||
= help: to escape `[` and `]` characters, just add '/' before them like `/[` or `/]`
|
||||
|
||||
warning: `[Qux:Y]` cannot be resolved, ignoring it...
|
||||
--> $DIR/intra-links-warning.rs:18:13
|
||||
|
|
||||
18 | /// [Qux:Y]
|
||||
| ^^^^^ cannot be resolved, ignoring
|
||||
|
|
||||
= help: to escape `[` and `]` characters, just add '/' before them like `/[` or `/]`
|
||||
|
||||
warning: `[BarA]` cannot be resolved, ignoring it...
|
||||
--> $DIR/intra-links-warning.rs:24:10
|
||||
|
|
||||
24 | /// bar [BarA] bar
|
||||
| ^^^^ cannot be resolved, ignoring
|
||||
|
|
||||
= help: to escape `[` and `]` characters, just add '/' before them like `/[` or `/]`
|
||||
|
||||
warning: `[BarB]` cannot be resolved, ignoring it...
|
||||
--> $DIR/intra-links-warning.rs:28:1
|
||||
|
@ -60,6 +77,7 @@ warning: `[BarB]` cannot be resolved, ignoring it...
|
|||
|
||||
bar [BarB] bar
|
||||
^^^^
|
||||
= help: to escape `[` and `]` characters, just add '/' before them like `/[` or `/]`
|
||||
|
||||
warning: `[BarC]` cannot be resolved, ignoring it...
|
||||
--> $DIR/intra-links-warning.rs:35:1
|
||||
|
@ -77,6 +95,7 @@ warning: `[BarC]` cannot be resolved, ignoring it...
|
|||
|
||||
bar [BarC] bar
|
||||
^^^^
|
||||
= help: to escape `[` and `]` characters, just add '/' before them like `/[` or `/]`
|
||||
|
||||
warning: `[BarD]` cannot be resolved, ignoring it...
|
||||
--> $DIR/intra-links-warning.rs:48:1
|
||||
|
@ -88,6 +107,7 @@ warning: `[BarD]` cannot be resolved, ignoring it...
|
|||
|
||||
bar [BarD] bar
|
||||
^^^^
|
||||
= help: to escape `[` and `]` characters, just add '/' before them like `/[` or `/]`
|
||||
|
||||
warning: `[BarF]` cannot be resolved, ignoring it...
|
||||
--> $DIR/intra-links-warning.rs:53:9
|
||||
|
@ -102,4 +122,5 @@ warning: `[BarF]` cannot be resolved, ignoring it...
|
|||
|
||||
bar [BarF] bar
|
||||
^^^^
|
||||
= help: to escape `[` and `]` characters, just add '/' before them like `/[` or `/]`
|
||||
|
||||
|
|
|
@ -13,8 +13,8 @@
|
|||
// therefore should not concern itself with the lints.
|
||||
#[deny(warnings)]
|
||||
|
||||
// @has cap_lints/struct.foo.html //pre '#[must_use]'
|
||||
// @has cap_lints/struct.Foo.html //pre '#[must_use]'
|
||||
#[must_use]
|
||||
pub struct foo {
|
||||
pub struct Foo {
|
||||
field: i32,
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue