diff --git a/src/librustdoc/html/render/context.rs b/src/librustdoc/html/render/context.rs
index ee71564a1417a..4d9e352595a1a 100644
--- a/src/librustdoc/html/render/context.rs
+++ b/src/librustdoc/html/render/context.rs
@@ -14,7 +14,7 @@ use rustc_hir::def_id::{DefIdMap, LOCAL_CRATE};
use rustc_middle::ty::TyCtxt;
use rustc_session::Session;
use rustc_span::edition::Edition;
-use rustc_span::{BytePos, FileName, Symbol};
+use rustc_span::{BytePos, FileName, RemapPathScopeComponents, Symbol};
use tracing::info;
use super::print_item::{full_path, print_item, print_item_path};
@@ -365,7 +365,10 @@ impl<'tcx> Context<'tcx> {
// We can safely ignore synthetic `SourceFile`s.
let file = match span.filename(self.sess()) {
- FileName::Real(ref path) => path.local_path()?.to_path_buf(),
+ FileName::Real(ref path) => path
+ .local_path()
+ .unwrap_or(path.path(RemapPathScopeComponents::MACRO))
+ .to_path_buf(),
_ => return None,
};
let file = &file;
@@ -499,10 +502,12 @@ impl<'tcx> Context<'tcx> {
} = options;
let src_root = match krate.src(tcx) {
- FileName::Real(ref p) => match p.local_path().map(|p| p.parent()).flatten() {
- Some(p) => p.to_path_buf(),
- None => PathBuf::new(),
- },
+ FileName::Real(ref p) => {
+ match p.local_path().unwrap_or(p.path(RemapPathScopeComponents::MACRO)).parent() {
+ Some(p) => p.to_path_buf(),
+ None => PathBuf::new(),
+ }
+ }
_ => PathBuf::new(),
};
// If user passed in `--playground-url` arg, we fill in crate name here
diff --git a/tests/rustdoc/auxiliary/remapped-paths.rs b/tests/rustdoc/auxiliary/remapped-paths.rs
new file mode 100644
index 0000000000000..f31d2d316f3aa
--- /dev/null
+++ b/tests/rustdoc/auxiliary/remapped-paths.rs
@@ -0,0 +1,11 @@
+//@ compile-flags:-Zunstable-options --remap-path-prefix={{src-base}}=
+
+pub struct MyStruct {
+ field: u32,
+}
+
+impl MyStruct {
+ pub fn new() -> MyStruct {
+ MyStruct { field: 3 }
+ }
+}
diff --git a/tests/rustdoc/import-remapped-paths.rs b/tests/rustdoc/import-remapped-paths.rs
new file mode 100644
index 0000000000000..9e7518f7c0170
--- /dev/null
+++ b/tests/rustdoc/import-remapped-paths.rs
@@ -0,0 +1,19 @@
+// This is a regression for `--remap-path-prefix` in an auxiliary dependency.
+//
+// We want to make sure that we can still have the "Source" links to the dependency
+// even if its paths are remapped.
+//
+// See also rust-lang/rust#150100
+
+//@ aux-build:remapped-paths.rs
+//@ build-aux-docs
+
+#![crate_name = "foo"]
+
+extern crate remapped_paths;
+
+//@ has foo/struct.MyStruct.html
+//@ has - '//a[@href="../src/remapped_paths/remapped-paths.rs.html#3"]' 'Source'
+//@ has - '//a[@href="../src/remapped_paths/remapped-paths.rs.html#8"]' 'Source'
+
+pub use remapped_paths::MyStruct;