From 53e0357d046bc4c2b6b1337989e4e53784832866 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Mon, 3 Aug 2020 14:38:06 +0200 Subject: [PATCH 1/2] Link to bool primitive type if "true" or "false" is used --- src/librustdoc/clean/types.rs | 4 +- .../passes/collect_intra_doc_links.rs | 53 +++++++++++-------- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs index 89549eae2cb0e..a8273348209ad 100644 --- a/src/librustdoc/clean/types.rs +++ b/src/librustdoc/clean/types.rs @@ -629,9 +629,11 @@ impl Attributes { Some(( s.clone(), format!( - "{}{}std/primitive.{}.html{}", + "{}{}std/{}{}.html{}", url, if !url.ends_with('/') { "/" } else { "" }, + // This is needed in case we are generating for keywords. + if fragment[..tail].contains(".") { "" } else { "primitive." }, &fragment[..tail], &fragment[tail..] ), diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs index bf7a43236e061..a032153874ea4 100644 --- a/src/librustdoc/passes/collect_intra_doc_links.rs +++ b/src/librustdoc/passes/collect_intra_doc_links.rs @@ -747,30 +747,39 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> { }; if candidates.is_empty() { - resolution_failure(cx, &item, path_str, &dox, link_range); - // this could just be a normal link - continue; - } - - let len = candidates.clone().present_items().count(); - - if len == 1 { - candidates.present_items().next().unwrap() - } else if len == 2 && is_derive_trait_collision(&candidates) { - candidates.type_ns.unwrap() + if path_str == "true" || path_str == "false" { + item.attrs.links.push(( + ori_link, + None, + Some(format!("keyword.{}", path_str,)), + )); + continue; + } else { + resolution_failure(cx, &item, path_str, &dox, link_range); + // this could just be a normal link + continue; + } } else { - if is_derive_trait_collision(&candidates) { - candidates.macro_ns = None; + let len = candidates.clone().present_items().count(); + + if len == 1 { + candidates.present_items().next().unwrap() + } else if len == 2 && is_derive_trait_collision(&candidates) { + candidates.type_ns.unwrap() + } else { + if is_derive_trait_collision(&candidates) { + candidates.macro_ns = None; + } + ambiguity_error( + cx, + &item, + path_str, + &dox, + link_range, + candidates.map(|candidate| candidate.map(|(res, _)| res)), + ); + continue; } - ambiguity_error( - cx, - &item, - path_str, - &dox, - link_range, - candidates.map(|candidate| candidate.map(|(res, _)| res)), - ); - continue; } } Some(MacroNS) => { From 66d998f4f2a9218239a5b624272a624441aba844 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Mon, 3 Aug 2020 14:38:19 +0200 Subject: [PATCH 2/2] Add test for true/false intra-doc link --- src/test/rustdoc/intra-doc-link-true-false.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/test/rustdoc/intra-doc-link-true-false.rs diff --git a/src/test/rustdoc/intra-doc-link-true-false.rs b/src/test/rustdoc/intra-doc-link-true-false.rs new file mode 100644 index 0000000000000..4b2c451f03ad7 --- /dev/null +++ b/src/test/rustdoc/intra-doc-link-true-false.rs @@ -0,0 +1,10 @@ +#![deny(broken_intra_doc_links)] +#![crate_name = "foo"] + +// ignore-tidy-linelength + +// @has foo/index.html +// @has - '//*[@id="main"]//a[@href="https://doc.rust-lang.org/nightly/std/keyword.true.html"]' 'true' +// @has - '//*[@id="main"]//a[@href="https://doc.rust-lang.org/nightly/std/keyword.false.html"]' 'false' + +//! A `bool` is either [`true`] or [`false`].