about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2018-06-04 23:44:35 +0200
committerGuillaume Gomez <guillaume1.gomez@gmail.com>2018-06-09 14:07:25 +0200
commitb000cf07261af68c7aa47e10140c692bc03c85da (patch)
tree3d01760da01524fbc2c490030b278e3d3b34cadc /src
parent40f20b5327cdd8cf26601962d3a9cc01ce8b177c (diff)
downloadrust-b000cf07261af68c7aa47e10140c692bc03c85da.tar.gz
rust-b000cf07261af68c7aa47e10140c692bc03c85da.zip
Add lint for intra link resolution failure
Diffstat (limited to 'src')
-rw-r--r--src/librustc/lint/builtin.rs7
-rw-r--r--src/librustdoc/clean/mod.rs20
-rw-r--r--src/librustdoc/core.rs28
-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.stderr16
5 files changed, 76 insertions, 9 deletions
diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs
index 02559e413fc..e2acd77a3b6 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_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_LINK_RESOLUTION_FAILURE,
         )
     }
 }
diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs
index 3f883eab172..8328a8385c3 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_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_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,7 +1310,10 @@ fn resolution_failure(
         }
         diag
     } else {
-        cx.sess().struct_span_warn(sp, &msg)
+        cx.tcx.struct_span_lint_node(lint::builtin::INTRA_LINK_RESOLUTION_FAILURE,
+                                                NodeId::new(0),
+                                                sp,
+                                                &msg)
     };
     diag.emit();
 }
diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs
index bad5ff2596f..9a733ab4249 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,23 @@ 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_LINK_RESOLUTION_FAILURE.name;
+    let warnings_lint_name = lint::builtin::WARNINGS.name;
+    let lints = lint::builtin::HardwiredLints.get_lints()
+                    .iter()
+                    .filter_map(|lint| {
+                        if lint.name == warnings_lint_name {
+                            None
+                        } else {
+                            let level = if lint.name == intra_link_resolution_failure_name {
+                                lint::Warn
+                            } else {
+                                lint::Allow
+                            };
+                            Some((lint.name_lower(), level))
+                        }
+                    })
+                    .collect::<Vec<_>>();
 
     let host_triple = TargetTriple::from_triple(config::host_triple());
     // plays with error output here!
@@ -195,8 +211,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::Warn),
         cg,
         externs,
         target_triple: triple.unwrap_or(host_triple),
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..f816621c16f
--- /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_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..39fb33ce933
--- /dev/null
+++ b/src/test/rustdoc-ui/deny-intra-link-resolution-failure.stderr
@@ -0,0 +1,16 @@
+warning: [v2] cannot be resolved, ignoring it...
+  --> src/test/rustdoc-ui/deny-intra-link-resolution-failure.rs:13:1
+   |
+LL | /// [v2] //~ ERROR
+   | ^^^^^^^^^^^^^^^^^^
+   |
+note: lint level defined here
+  --> src/test/rustdoc-ui/deny-intra-link-resolution-failure.rs:11:9
+   |
+LL | #![deny(intra_link_resolution_failure)]
+   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   = note: the link appears in this line:
+
+            [v2] //~ ERROR
+             ^^
+