Skip to content

Commit

Permalink
Resolve crate properly across crates
Browse files Browse the repository at this point in the history
  • Loading branch information
jyn514 committed Sep 27, 2020
1 parent b836329 commit 8437d7b
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 1 deletion.
13 changes: 12 additions & 1 deletion src/librustdoc/passes/collect_intra_doc_links.rs
Original file line number Diff line number Diff line change
Expand Up @@ -911,7 +911,7 @@ impl LinkCollector<'_, '_> {
parent_node
};

let module_id = if let Some(id) = base_node {
let mut module_id = if let Some(id) = base_node {
id
} else {
debug!("attempting to resolve item without parent module: {}", path_str);
Expand All @@ -934,6 +934,17 @@ impl LinkCollector<'_, '_> {
resolved_self = format!("{}::{}", name, &path_str[6..]);
path_str = &resolved_self;
}
} else if path_str.starts_with("crate::") {
use rustc_span::def_id::CRATE_DEF_INDEX;

// HACK(jynelson): rustc_resolve thinks that `crate` is the crate currently being documented.
// But rustdoc wants it to mean the crate this item was originally present in.
// To work around this, remove it and resolve relative to the crate root instead.
// 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.
resolved_self = format!("self::{}", &path_str["crate::".len()..]);
path_str = &resolved_self;
module_id = DefId { krate: item.def_id.krate, index: CRATE_DEF_INDEX };
}

match self.resolve_with_disambiguator(
Expand Down
5 changes: 5 additions & 0 deletions src/test/rustdoc/auxiliary/intra-link-cross-crate-crate.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#![crate_name = "inner"]

/// Links to [crate::g]
pub fn f() {}
pub fn g() {}
6 changes: 6 additions & 0 deletions src/test/rustdoc/intra-link-cross-crate-crate.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// aux-build:intra-link-cross-crate-crate.rs
// build-aux-docs
#![crate_name = "outer"]
extern crate inner;
// @has outer/fn.f.html '//a[@href="../inner/fn.g.html"]' "crate::g"
pub use inner::f;

0 comments on commit 8437d7b

Please sign in to comment.