about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorJoshua Nelson <jyn514@gmail.com>2020-09-11 13:42:56 -0400
committerJoshua Nelson <jyn514@gmail.com>2020-09-11 13:42:56 -0400
commit57250eff55db7c034b9d3468b45b0df2d6ee4bb3 (patch)
tree83c30a2359fc15290745b0b4381a4710e122f1fc /src
parentc213c68500f5fff51f26997d27a346c896232df7 (diff)
downloadrust-57250eff55db7c034b9d3468b45b0df2d6ee4bb3.tar.gz
rust-57250eff55db7c034b9d3468b45b0df2d6ee4bb3.zip
Use `span_label` instead of `note`
This puts the error message closer to the link, making it easier to see
what went wrong.
Diffstat (limited to 'src')
-rw-r--r--src/librustdoc/passes/collect_intra_doc_links.rs84
-rw-r--r--src/test/rustdoc-ui/intra-links-warning-crlf.stderr12
-rw-r--r--src/test/rustdoc-ui/intra-links-warning.stderr47
3 files changed, 65 insertions, 78 deletions
diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs
index 7fea70253b3..03190966352 100644
--- a/src/librustdoc/passes/collect_intra_doc_links.rs
+++ b/src/librustdoc/passes/collect_intra_doc_links.rs
@@ -1516,16 +1516,15 @@ fn resolution_failure(
                     collector.cx.tcx.item_name(res.def_id()).to_string()
                 )
             };
-            let assoc_item_not_allowed = |res: Res, diag: &mut DiagnosticBuilder<'_>| {
+            let assoc_item_not_allowed = |res: Res| {
                 let def_id = res.def_id();
                 let name = collector.cx.tcx.item_name(def_id);
-                let note = format!(
+                format!(
                     "`{}` is {} {}, not a module or type, and cannot have associated items",
                     name,
                     res.article(),
                     res.descr()
-                );
-                diag.note(&note);
+                )
             };
             // ignore duplicates
             let mut variants_seen = SmallVec::<[_; 3]>::new();
@@ -1559,12 +1558,18 @@ fn resolution_failure(
                     continue;
                 }
                 variants_seen.push(variant);
-                match failure {
+                let note = match failure {
                     ResolutionFailure::NotInScope { name, .. } => {
                         if in_scope {
                             continue;
                         }
-                        diag.note(&format!("no item named `{}` is in scope", name));
+                        // NOTE: uses an explicit `continue` so the `note:` will come before the `help:`
+                        let note = format!("no item named `{}` is in scope", name);
+                        if let Some(span) = sp {
+                            diag.span_label(span, &note);
+                        } else {
+                            diag.note(&note);
+                        }
                         // If the link has `::` in the path, assume it's meant to be an intra-doc link
                         if !path_str.contains("::") {
                             // Otherwise, the `[]` might be unrelated.
@@ -1572,16 +1577,10 @@ fn resolution_failure(
                             // don't show this for autolinks (`<>`), `()` style links, or reference links
                             diag.help(r#"to escape `[` and `]` characters, add '\' before them like `\[` or `\]`"#);
                         }
+                        continue;
                     }
                     ResolutionFailure::Dummy => continue,
                     ResolutionFailure::WrongNamespace(res, expected_ns) => {
-                        let note = format!(
-                            "this link resolves to {}, which is not in the {} namespace",
-                            item(res),
-                            expected_ns.descr()
-                        );
-                        diag.note(&note);
-
                         if let Res::Def(kind, _) = res {
                             let disambiguator = Disambiguator::Kind(kind);
                             suggest_disambiguator(
@@ -1593,24 +1592,26 @@ fn resolution_failure(
                                 &link_range,
                             )
                         }
+
+                        format!(
+                            "this link resolves to {}, which is not in the {} namespace",
+                            item(res),
+                            expected_ns.descr()
+                        )
                     }
                     ResolutionFailure::NoParentItem => {
                         diag.level = rustc_errors::Level::Bug;
-                        diag.note("all intra doc links should have a parent item");
-                    }
-                    ResolutionFailure::NoPrimitiveImpl(res, _) => {
-                        let note = format!(
-                            "this link partially resolves to {}, which does not have any associated items",
-                            item(res),
-                        );
-                        diag.note(&note);
+                        "all intra doc links should have a parent item".to_owned()
                     }
+                    ResolutionFailure::NoPrimitiveImpl(res, _) => format!(
+                        "this link partially resolves to {}, which does not have any associated items",
+                        item(res),
+                    ),
                     ResolutionFailure::NoPrimitiveAssocItem { prim_name, assoc_item, .. } => {
-                        let note = format!(
+                        format!(
                             "the builtin type `{}` does not have an associated item named `{}`",
                             prim_name, assoc_item
-                        );
-                        diag.note(&note);
+                        )
                     }
                     ResolutionFailure::NoAssocItem(res, assoc_item) => {
                         use DefKind::*;
@@ -1645,32 +1646,41 @@ fn resolution_failure(
                                 | Use
                                 | LifetimeParam
                                 | Ctor(_, _)
-                                | AnonConst => return assoc_item_not_allowed(res, diag),
+                                | AnonConst => {
+                                    let note = assoc_item_not_allowed(res);
+                                    if let Some(span) = sp {
+                                        diag.span_label(span, &note);
+                                    } else {
+                                        diag.note(&note);
+                                    }
+                                    return;
+                                }
                                 Trait | TyAlias | ForeignTy | OpaqueTy | TraitAlias | TyParam
                                 | Static => "associated item",
                                 Impl | GlobalAsm => unreachable!("not a path"),
                             }
                         };
-                        let note = format!(
+                        format!(
                             "the {} `{}` has no {} named `{}`",
                             res.descr(),
                             name,
                             path_description,
                             assoc_item
-                        );
-                        diag.note(&note);
+                        )
                     }
                     ResolutionFailure::CannotHaveAssociatedItems(res, _) => {
-                        assoc_item_not_allowed(res, diag)
-                    }
-                    ResolutionFailure::NotAVariant(res, variant) => {
-                        let note = format!(
-                            "this link partially resolves to {}, but there is no variant named {}",
-                            item(res),
-                            variant
-                        );
-                        diag.note(&note);
+                        assoc_item_not_allowed(res)
                     }
+                    ResolutionFailure::NotAVariant(res, variant) => format!(
+                        "this link partially resolves to {}, but there is no variant named {}",
+                        item(res),
+                        variant
+                    ),
+                };
+                if let Some(span) = sp {
+                    diag.span_label(span, &note);
+                } else {
+                    diag.note(&note);
                 }
             }
         },
diff --git a/src/test/rustdoc-ui/intra-links-warning-crlf.stderr b/src/test/rustdoc-ui/intra-links-warning-crlf.stderr
index 1da27b78618..d64c7e14ba6 100644
--- a/src/test/rustdoc-ui/intra-links-warning-crlf.stderr
+++ b/src/test/rustdoc-ui/intra-links-warning-crlf.stderr
@@ -2,37 +2,33 @@ warning: unresolved link to `error`
   --> $DIR/intra-links-warning-crlf.rs:7:6
    |
 LL | /// [error]
-   |      ^^^^^
+   |      ^^^^^ no item named `error` is in scope
    |
    = note: `#[warn(broken_intra_doc_links)]` on by default
-   = note: no item named `error` is in scope
    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
 
 warning: unresolved link to `error1`
   --> $DIR/intra-links-warning-crlf.rs:12:11
    |
 LL | /// docs [error1]
-   |           ^^^^^^
+   |           ^^^^^^ no item named `error1` is in scope
    |
-   = note: no item named `error1` is in scope
    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
 
 warning: unresolved link to `error2`
   --> $DIR/intra-links-warning-crlf.rs:15:11
    |
 LL | /// docs [error2]
-   |           ^^^^^^
+   |           ^^^^^^ no item named `error2` is in scope
    |
-   = note: no item named `error2` is in scope
    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
 
 warning: unresolved link to `error`
   --> $DIR/intra-links-warning-crlf.rs:23:20
    |
 LL |  * It also has an [error].
-   |                    ^^^^^
+   |                    ^^^^^ no item named `error` is in scope
    |
-   = note: no item named `error` is in scope
    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
 
 warning: 4 warnings emitted
diff --git a/src/test/rustdoc-ui/intra-links-warning.stderr b/src/test/rustdoc-ui/intra-links-warning.stderr
index 25c6975d3a5..0eaad25501a 100644
--- a/src/test/rustdoc-ui/intra-links-warning.stderr
+++ b/src/test/rustdoc-ui/intra-links-warning.stderr
@@ -2,76 +2,62 @@ warning: unresolved link to `Foo::baz`
   --> $DIR/intra-links-warning.rs:3:23
    |
 LL |        //! Test with [Foo::baz], [Bar::foo], ...
-   |                       ^^^^^^^^
+   |                       ^^^^^^^^ the struct `Foo` has no field or associated item named `baz`
    |
    = note: `#[warn(broken_intra_doc_links)]` on by default
-   = note: the struct `Foo` has no field or associated item named `baz`
 
 warning: unresolved link to `Bar::foo`
   --> $DIR/intra-links-warning.rs:3:35
    |
 LL |        //! Test with [Foo::baz], [Bar::foo], ...
-   |                                   ^^^^^^^^
-   |
-   = note: no item named `Bar` is in scope
+   |                                   ^^^^^^^^ no item named `Bar` is in scope
 
 warning: unresolved link to `Uniooon::X`
   --> $DIR/intra-links-warning.rs:6:13
    |
 LL |      //! , [Uniooon::X] and [Qux::Z].
-   |             ^^^^^^^^^^
-   |
-   = note: no item named `Uniooon` is in scope
+   |             ^^^^^^^^^^ no item named `Uniooon` is in scope
 
 warning: unresolved link to `Qux::Z`
   --> $DIR/intra-links-warning.rs:6:30
    |
 LL |      //! , [Uniooon::X] and [Qux::Z].
-   |                              ^^^^^^
-   |
-   = note: no item named `Qux` is in scope
+   |                              ^^^^^^ no item named `Qux` is in scope
 
 warning: unresolved link to `Uniooon::X`
   --> $DIR/intra-links-warning.rs:10:14
    |
 LL |       //! , [Uniooon::X] and [Qux::Z].
-   |              ^^^^^^^^^^
-   |
-   = note: no item named `Uniooon` is in scope
+   |              ^^^^^^^^^^ no item named `Uniooon` is in scope
 
 warning: unresolved link to `Qux::Z`
   --> $DIR/intra-links-warning.rs:10:31
    |
 LL |       //! , [Uniooon::X] and [Qux::Z].
-   |                               ^^^^^^
-   |
-   = note: no item named `Qux` is in scope
+   |                               ^^^^^^ no item named `Qux` is in scope
 
 warning: unresolved link to `Qux:Y`
   --> $DIR/intra-links-warning.rs:14:13
    |
 LL |        /// [Qux:Y]
-   |             ^^^^^
+   |             ^^^^^ no item named `Qux:Y` is in scope
    |
-   = note: no item named `Qux:Y` is in scope
    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
 
 warning: unresolved link to `error`
   --> $DIR/intra-links-warning.rs:58:30
    |
 LL |  * time to introduce a link [error]*/
-   |                              ^^^^^
+   |                              ^^^^^ no item named `error` is in scope
    |
-   = note: no item named `error` is in scope
    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
 
 warning: unresolved link to `error`
   --> $DIR/intra-links-warning.rs:64:30
    |
 LL |  * time to introduce a link [error]
-   |                              ^^^^^
+   |                              ^^^^^ no item named `error` is in scope
    |
-   = note: no item named `error` is in scope
    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
 
 warning: unresolved link to `error`
@@ -119,45 +105,40 @@ warning: unresolved link to `error1`
   --> $DIR/intra-links-warning.rs:80:11
    |
 LL | /// docs [error1]
-   |           ^^^^^^
+   |           ^^^^^^ no item named `error1` is in scope
    |
-   = note: no item named `error1` is in scope
    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
 
 warning: unresolved link to `error2`
   --> $DIR/intra-links-warning.rs:82:11
    |
 LL | /// docs [error2]
-   |           ^^^^^^
+   |           ^^^^^^ no item named `error2` is in scope
    |
-   = note: no item named `error2` is in scope
    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
 
 warning: unresolved link to `BarA`
   --> $DIR/intra-links-warning.rs:21:10
    |
 LL | /// bar [BarA] bar
-   |          ^^^^
+   |          ^^^^ no item named `BarA` is in scope
    |
-   = note: no item named `BarA` is in scope
    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
 
 warning: unresolved link to `BarB`
   --> $DIR/intra-links-warning.rs:27:9
    |
 LL |  * bar [BarB] bar
-   |         ^^^^
+   |         ^^^^ no item named `BarB` is in scope
    |
-   = note: no item named `BarB` is in scope
    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
 
 warning: unresolved link to `BarC`
   --> $DIR/intra-links-warning.rs:34:6
    |
 LL | bar [BarC] bar
-   |      ^^^^
+   |      ^^^^ no item named `BarC` is in scope
    |
-   = note: no item named `BarC` is in scope
    = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
 
 warning: unresolved link to `BarD`