about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2018-06-17 02:57:40 +0000
committerbors <bors@rust-lang.org>2018-06-17 02:57:40 +0000
commit0f8f4903f73a21d7f408870551c08acd051abeb0 (patch)
tree153096172dafabb7a33ba69592194812e1faea13
parent68da15eae9c9cd2cb7a544f895105eb067d4b1c9 (diff)
parent6a03884ce99df2002ddaa1155de65384f7767cd5 (diff)
downloadrust-0f8f4903f73a21d7f408870551c08acd051abeb0.tar.gz
rust-0f8f4903f73a21d7f408870551c08acd051abeb0.zip
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
-rw-r--r--src/librustc/lint/builtin.rs7
-rw-r--r--src/librustc_lint/builtin.rs33
-rw-r--r--src/librustc_lint/lib.rs3
-rw-r--r--src/librustdoc/clean/mod.rs22
-rw-r--r--src/librustdoc/core.rs25
-rw-r--r--src/libstd/sys/unix/ext/mod.rs1
-rw-r--r--src/libstd/sys/windows/ext/mod.rs1
-rw-r--r--src/test/rustdoc-ui/deny-intra-link-resolution-failure.rs14
-rw-r--r--src/test/rustdoc-ui/deny-intra-link-resolution-failure.stderr13
-rw-r--r--src/test/rustdoc-ui/intra-links-warning.stderr21
-rw-r--r--src/test/rustdoc/cap-lints.rs4
11 files changed, 133 insertions, 11 deletions
diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs
index 02559e413fc..7d4a18c2a57 100644
--- a/src/librustc/lint/builtin.rs
+++ b/src/librustc/lint/builtin.rs
@@ -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,
         )
     }
 }
diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs
index 0a647365598..79796d78871 100644
--- a/src/librustc_lint/builtin.rs
+++ b/src/librustc_lint/builtin.rs
@@ -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,
+        )
+    }
+}
diff --git a/src/librustc_lint/lib.rs b/src/librustc_lint/lib.rs
index 47f17285f5f..9ac22f8dceb 100644
--- a/src/librustc_lint/lib.rs
+++ b/src/librustc_lint/lib.rs
@@ -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`).
diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs
index 15c2e7b72f6..8d3cf223509 100644
--- a/src/librustdoc/clean/mod.rs
+++ b/src/librustdoc/clean/mod.rs
@@ -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();
 }
 
diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs
index 9b5e1074cfa..e858f10860b 100644
--- a/src/librustdoc/core.rs
+++ b/src/librustdoc/core.rs
@@ -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),
diff --git a/src/libstd/sys/unix/ext/mod.rs b/src/libstd/sys/unix/ext/mod.rs
index c221f7c8cfe..88e4237f8e2 100644
--- a/src/libstd/sys/unix/ext/mod.rs
+++ b/src/libstd/sys/unix/ext/mod.rs
@@ -35,6 +35,7 @@
 
 #![stable(feature = "rust1", since = "1.0.0")]
 #![doc(cfg(unix))]
+#![allow(missing_docs)]
 
 pub mod io;
 pub mod ffi;
diff --git a/src/libstd/sys/windows/ext/mod.rs b/src/libstd/sys/windows/ext/mod.rs
index 4b458d293bc..1f10609f32c 100644
--- a/src/libstd/sys/windows/ext/mod.rs
+++ b/src/libstd/sys/windows/ext/mod.rs
@@ -18,6 +18,7 @@
 
 #![stable(feature = "rust1", since = "1.0.0")]
 #![doc(cfg(windows))]
+#![allow(missing_docs)]
 
 pub mod ffi;
 pub mod fs;
diff --git a/src/test/rustdoc-ui/deny-intra-link-resolution-failure.rs b/src/test/rustdoc-ui/deny-intra-link-resolution-failure.rs
new file mode 100644
index 00000000000..85d19c83547
--- /dev/null
+++ b/src/test/rustdoc-ui/deny-intra-link-resolution-failure.rs
@@ -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() {}
diff --git a/src/test/rustdoc-ui/deny-intra-link-resolution-failure.stderr b/src/test/rustdoc-ui/deny-intra-link-resolution-failure.stderr
new file mode 100644
index 00000000000..66ee48ed4c9
--- /dev/null
+++ b/src/test/rustdoc-ui/deny-intra-link-resolution-failure.stderr
@@ -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 `/]`
+
diff --git a/src/test/rustdoc-ui/intra-links-warning.stderr b/src/test/rustdoc-ui/intra-links-warning.stderr
index 52adba5679f..2a51e94b1f5 100644
--- a/src/test/rustdoc-ui/intra-links-warning.stderr
+++ b/src/test/rustdoc-ui/intra-links-warning.stderr
@@ -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 `/]`
 
diff --git a/src/test/rustdoc/cap-lints.rs b/src/test/rustdoc/cap-lints.rs
index e7f308a6f0b..39e753daadb 100644
--- a/src/test/rustdoc/cap-lints.rs
+++ b/src/test/rustdoc/cap-lints.rs
@@ -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,
 }