Skip to content

Commit

Permalink
Rollup merge of #80881 - jyn514:intra-doc-self, r=GuillaumeGomez
Browse files Browse the repository at this point in the history
 Fix intra-doc links to `Self` and `crate`

Closes #77732.
  • Loading branch information
JohnTitor committed Jan 11, 2021
2 parents 95a6279 + a52341d commit 6e2249d
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 21 deletions.
41 changes: 20 additions & 21 deletions src/librustdoc/passes/collect_intra_doc_links.rs
Original file line number Diff line number Diff line change
Expand Up @@ -504,15 +504,9 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
match res {
// FIXME(#76467): make this fallthrough to lookup the associated
// item a separate function.
Res::Def(DefKind::AssocFn | DefKind::AssocConst, _) => {
assert_eq!(ns, ValueNS);
}
Res::Def(DefKind::AssocTy, _) => {
assert_eq!(ns, TypeNS);
}
Res::Def(DefKind::Variant, _) => {
return handle_variant(cx, res, extra_fragment);
}
Res::Def(DefKind::AssocFn | DefKind::AssocConst, _) => assert_eq!(ns, ValueNS),
Res::Def(DefKind::AssocTy, _) => assert_eq!(ns, TypeNS),
Res::Def(DefKind::Variant, _) => return handle_variant(cx, res, extra_fragment),
// Not a trait item; just return what we found.
Res::Primitive(ty) => {
if extra_fragment.is_some() {
Expand All @@ -522,12 +516,7 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> {
}
return Ok((res, Some(ty.as_str().to_owned())));
}
Res::Def(DefKind::Mod, _) => {
return Ok((res, extra_fragment.clone()));
}
_ => {
return Ok((res, extra_fragment.clone()));
}
_ => return Ok((res, extra_fragment.clone())),
}
}

Expand Down Expand Up @@ -1024,12 +1013,18 @@ impl LinkCollector<'_, '_> {

let resolved_self;
// replace `Self` with suitable item's parent name
if path_str.starts_with("Self::") {
let is_lone_self = path_str == "Self";
let is_lone_crate = path_str == "crate";
if path_str.starts_with("Self::") || is_lone_self {
if let Some(ref name) = self_name {
resolved_self = format!("{}::{}", name, &path_str[6..]);
path_str = &resolved_self;
if is_lone_self {
path_str = name;
} else {
resolved_self = format!("{}::{}", name, &path_str[6..]);
path_str = &resolved_self;
}
}
} else if path_str.starts_with("crate::") {
} else if path_str.starts_with("crate::") || is_lone_crate {
use rustc_span::def_id::CRATE_DEF_INDEX;

// HACK(jynelson): rustc_resolve thinks that `crate` is the crate currently being documented.
Expand All @@ -1038,8 +1033,12 @@ impl LinkCollector<'_, '_> {
// HACK(jynelson)(2): If we just strip `crate::` then suddenly primitives become ambiguous
// (consider `crate::char`). Instead, change it to `self::`. This works because 'self' is now the crate root.
// FIXME(#78696): This doesn't always work.
resolved_self = format!("self::{}", &path_str["crate::".len()..]);
path_str = &resolved_self;
if is_lone_crate {
path_str = "self";
} else {
resolved_self = format!("self::{}", &path_str["crate::".len()..]);
path_str = &resolved_self;
}
module_id = DefId { krate, index: CRATE_DEF_INDEX };
}

Expand Down
3 changes: 3 additions & 0 deletions src/test/rustdoc/intra-doc-crate/auxiliary/self.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
#![crate_name = "cross_crate_self"]

/// Link to [Self]
/// Link to [crate]
pub struct S;

impl S {
Expand Down
3 changes: 3 additions & 0 deletions src/test/rustdoc/intra-doc-crate/self.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
// aux-build:self.rs
// build-aux-docs

extern crate cross_crate_self;

// @has self/struct.S.html '//a[@href="../self/struct.S.html#method.f"]' "Self::f"
// @has self/struct.S.html '//a[@href="../self/struct.S.html"]' "Self"
// @has self/struct.S.html '//a[@href="../cross_crate_self/index.html"]' "crate"
pub use cross_crate_self::S;

0 comments on commit 6e2249d

Please sign in to comment.