about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEdward Shen <code@eddie.sh>2024-06-09 10:17:21 -0700
committerEdward Shen <code@eddie.sh>2024-06-09 10:34:54 -0700
commitd9f78cb7939b340f72389fbaedfa4d872d0bbe43 (patch)
treeecec62b566c18a2c9694b329dfe3fa62d39689a7
parent212841e17cce13d1e29b00ad144300b687bfafdd (diff)
downloadrust-d9f78cb7939b340f72389fbaedfa4d872d0bbe43.tar.gz
rust-d9f78cb7939b340f72389fbaedfa4d872d0bbe43.zip
rustdoc: Add support for --remap-path-prefix
Adds --remap-path-prefix as an unstable option. This is implemented to
mimic the behavior of rustc's --remap-path-prefix but with minor
adjustments.

This flag similarly takes in two paths, a prefix to replace and a
replacement string.
-rw-r--r--src/librustdoc/config.rs26
-rw-r--r--src/librustdoc/doctest.rs4
-rw-r--r--src/librustdoc/doctest/rust.rs12
-rw-r--r--src/librustdoc/lib.rs8
-rw-r--r--tests/run-make/issue-88756-default-output/output-default.stdout2
-rw-r--r--tests/rustdoc-ui/remap-path-prefix-failed-doctest-output.rs14
-rw-r--r--tests/rustdoc-ui/remap-path-prefix-failed-doctest-output.stdout21
-rw-r--r--tests/rustdoc-ui/remap-path-prefix-invalid-doctest.rs13
-rw-r--r--tests/rustdoc-ui/remap-path-prefix-invalid-doctest.stdout22
-rw-r--r--tests/rustdoc-ui/remap-path-prefix-passed-doctest-output.rs14
-rw-r--r--tests/rustdoc-ui/remap-path-prefix-passed-doctest-output.stdout6
11 files changed, 135 insertions, 7 deletions
diff --git a/src/librustdoc/config.rs b/src/librustdoc/config.rs
index 012afada1e5..78d4129f642 100644
--- a/src/librustdoc/config.rs
+++ b/src/librustdoc/config.rs
@@ -128,6 +128,8 @@ pub(crate) struct Options {
     pub(crate) enable_per_target_ignores: bool,
     /// Do not run doctests, compile them if should_test is active.
     pub(crate) no_run: bool,
+    /// What sources are being mapped.
+    pub(crate) remap_path_prefix: Vec<(PathBuf, PathBuf)>,
 
     /// The path to a rustc-like binary to build tests with. If not set, we
     /// default to loading from `$sysroot/bin/rustc`.
@@ -211,6 +213,7 @@ impl fmt::Debug for Options {
             .field("run_check", &self.run_check)
             .field("no_run", &self.no_run)
             .field("test_builder_wrappers", &self.test_builder_wrappers)
+            .field("remap-file-prefix", &self.remap_path_prefix)
             .field("nocapture", &self.nocapture)
             .field("scrape_examples_options", &self.scrape_examples_options)
             .field("unstable_features", &self.unstable_features)
@@ -372,6 +375,13 @@ impl Options {
         let codegen_options = CodegenOptions::build(early_dcx, matches);
         let unstable_opts = UnstableOptions::build(early_dcx, matches);
 
+        let remap_path_prefix = match parse_remap_path_prefix(&matches) {
+            Ok(prefix_mappings) => prefix_mappings,
+            Err(err) => {
+                early_dcx.early_fatal(err);
+            }
+        };
+
         let dcx = new_dcx(error_format, None, diagnostic_width, &unstable_opts);
 
         // check for deprecated options
@@ -772,6 +782,7 @@ impl Options {
             run_check,
             no_run,
             test_builder_wrappers,
+            remap_path_prefix,
             nocapture,
             crate_name,
             output_format,
@@ -820,6 +831,21 @@ impl Options {
     }
 }
 
+fn parse_remap_path_prefix(
+    matches: &getopts::Matches,
+) -> Result<Vec<(PathBuf, PathBuf)>, &'static str> {
+    matches
+        .opt_strs("remap-path-prefix")
+        .into_iter()
+        .map(|remap| {
+            remap
+                .rsplit_once('=')
+                .ok_or("--remap-path-prefix must contain '=' between FROM and TO")
+                .map(|(from, to)| (PathBuf::from(from), PathBuf::from(to)))
+        })
+        .collect()
+}
+
 /// Prints deprecation warnings for deprecated options
 fn check_deprecated_options(matches: &getopts::Matches, dcx: &rustc_errors::DiagCtxt) {
     let deprecated_flags = [];
diff --git a/src/librustdoc/doctest.rs b/src/librustdoc/doctest.rs
index a732e645b6b..81a7463deca 100644
--- a/src/librustdoc/doctest.rs
+++ b/src/librustdoc/doctest.rs
@@ -129,6 +129,7 @@ pub(crate) fn run(
         edition: options.edition,
         target_triple: options.target.clone(),
         crate_name: options.crate_name.clone(),
+        remap_path_prefix: options.remap_path_prefix.clone(),
         ..config::Options::default()
     };
 
@@ -572,7 +573,6 @@ fn make_maybe_absolute_path(path: PathBuf) -> PathBuf {
         std::env::current_dir().map(|c| c.join(&path)).unwrap_or_else(|_| path)
     }
 }
-
 struct IndividualTestOptions {
     outdir: DirState,
     test_id: String,
@@ -651,7 +651,7 @@ impl CreateRunnableDoctests {
         if !item_path.is_empty() {
             item_path.push(' ');
         }
-        format!("{} - {item_path}(line {line})", filename.prefer_local())
+        format!("{} - {item_path}(line {line})", filename.prefer_remapped_unconditionaly())
     }
 
     fn add_test(&mut self, test: ScrapedDoctest) {
diff --git a/src/librustdoc/doctest/rust.rs b/src/librustdoc/doctest/rust.rs
index e6bef395fa9..fc8e119ccc2 100644
--- a/src/librustdoc/doctest/rust.rs
+++ b/src/librustdoc/doctest/rust.rs
@@ -27,11 +27,13 @@ struct RustCollector {
 impl RustCollector {
     fn get_filename(&self) -> FileName {
         let filename = self.source_map.span_to_filename(self.position);
-        if let FileName::Real(ref filename) = filename
-            && let Ok(cur_dir) = env::current_dir()
-            && let Some(local_path) = filename.local_path()
-            && let Ok(path) = local_path.strip_prefix(&cur_dir)
-        {
+        if let FileName::Real(ref filename) = filename {
+            let path = filename.remapped_path_if_available();
+            // Strip the cwd prefix from the path. This will likely exist if
+            // the path was not remapped.
+            let path = env::current_dir()
+                .map(|cur_dir| path.strip_prefix(&cur_dir).unwrap_or(path))
+                .unwrap_or(path);
             return path.to_owned().into();
         }
         filename
diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs
index 3b6bddf263a..d6e715d48ea 100644
--- a/src/librustdoc/lib.rs
+++ b/src/librustdoc/lib.rs
@@ -555,6 +555,14 @@ fn opts() -> Vec<RustcOptGroup> {
         unstable("no-run", |o| {
             o.optflagmulti("", "no-run", "Compile doctests without running them")
         }),
+        unstable("remap-path-prefix", |o| {
+            o.optmulti(
+                "",
+                "remap-path-prefix",
+                "Remap source names in compiler messages",
+                "FROM=TO",
+            )
+        }),
         unstable("show-type-layout", |o| {
             o.optflagmulti("", "show-type-layout", "Include the memory layout of types in the docs")
         }),
diff --git a/tests/run-make/issue-88756-default-output/output-default.stdout b/tests/run-make/issue-88756-default-output/output-default.stdout
index 12c1b389fb3..bc38d9e9dc6 100644
--- a/tests/run-make/issue-88756-default-output/output-default.stdout
+++ b/tests/run-make/issue-88756-default-output/output-default.stdout
@@ -157,6 +157,8 @@ Options:
                         Comma separated list of types of output for rustdoc to
                         emit
         --no-run        Compile doctests without running them
+        --remap-path-prefix FROM=TO
+                        Remap source names in compiler messages
         --show-type-layout 
                         Include the memory layout of types in the docs
         --nocapture     Don't capture stdout and stderr of tests
diff --git a/tests/rustdoc-ui/remap-path-prefix-failed-doctest-output.rs b/tests/rustdoc-ui/remap-path-prefix-failed-doctest-output.rs
new file mode 100644
index 00000000000..2b220370d77
--- /dev/null
+++ b/tests/rustdoc-ui/remap-path-prefix-failed-doctest-output.rs
@@ -0,0 +1,14 @@
+// FIXME: if/when the output of the test harness can be tested on its own, this test should be
+// adapted to use that, and that normalize line can go away
+
+//@ failure-status: 101
+//@ compile-flags:--test -Z unstable-options --remap-path-prefix={{src-base}}=remapped_path --test-args --test-threads=1
+//@ rustc-env:RUST_BACKTRACE=0
+//@ normalize-stdout-test "finished in \d+\.\d+s" -> "finished in $$TIME"
+//@ normalize-stdout-test "exit (status|code): 101" -> "exit status: 101"
+
+// doctest fails at runtime
+/// ```
+/// panic!("oh no");
+/// ```
+pub struct SomeStruct;
diff --git a/tests/rustdoc-ui/remap-path-prefix-failed-doctest-output.stdout b/tests/rustdoc-ui/remap-path-prefix-failed-doctest-output.stdout
new file mode 100644
index 00000000000..2102e2c3891
--- /dev/null
+++ b/tests/rustdoc-ui/remap-path-prefix-failed-doctest-output.stdout
@@ -0,0 +1,21 @@
+
+running 1 test
+test remapped_path/remap-path-prefix-failed-doctest-output.rs - SomeStruct (line 11) ... FAILED
+
+failures:
+
+---- remapped_path/remap-path-prefix-failed-doctest-output.rs - SomeStruct (line 11) stdout ----
+Test executable failed (exit status: 101).
+
+stderr:
+thread 'main' panicked at remapped_path/remap-path-prefix-failed-doctest-output.rs:3:1:
+oh no
+note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
+
+
+
+failures:
+    remapped_path/remap-path-prefix-failed-doctest-output.rs - SomeStruct (line 11)
+
+test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in $TIME
+
diff --git a/tests/rustdoc-ui/remap-path-prefix-invalid-doctest.rs b/tests/rustdoc-ui/remap-path-prefix-invalid-doctest.rs
new file mode 100644
index 00000000000..2e023e32d7a
--- /dev/null
+++ b/tests/rustdoc-ui/remap-path-prefix-invalid-doctest.rs
@@ -0,0 +1,13 @@
+// FIXME: if/when the output of the test harness can be tested on its own, this test should be
+// adapted to use that, and that normalize line can go away
+
+//@ failure-status: 101
+//@ compile-flags:--test -Z unstable-options --remap-path-prefix={{src-base}}=remapped_path --test-args --test-threads=1
+//@ rustc-env:RUST_BACKTRACE=0
+//@ normalize-stdout-test "finished in \d+\.\d+s" -> "finished in $$TIME"
+
+// doctest fails to compile
+/// ```
+/// this is not real code
+/// ```
+pub struct SomeStruct;
diff --git a/tests/rustdoc-ui/remap-path-prefix-invalid-doctest.stdout b/tests/rustdoc-ui/remap-path-prefix-invalid-doctest.stdout
new file mode 100644
index 00000000000..a05b5169989
--- /dev/null
+++ b/tests/rustdoc-ui/remap-path-prefix-invalid-doctest.stdout
@@ -0,0 +1,22 @@
+
+running 1 test
+test remapped_path/remap-path-prefix-invalid-doctest.rs - SomeStruct (line 10) ... FAILED
+
+failures:
+
+---- remapped_path/remap-path-prefix-invalid-doctest.rs - SomeStruct (line 10) stdout ----
+error: expected one of `!`, `.`, `::`, `;`, `?`, `{`, `}`, or an operator, found `is`
+  --> remapped_path/remap-path-prefix-invalid-doctest.rs:11:6
+   |
+LL | this is not real code
+   |      ^^ expected one of 8 possible tokens
+
+error: aborting due to 1 previous error
+
+Couldn't compile the test.
+
+failures:
+    remapped_path/remap-path-prefix-invalid-doctest.rs - SomeStruct (line 10)
+
+test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in $TIME
+
diff --git a/tests/rustdoc-ui/remap-path-prefix-passed-doctest-output.rs b/tests/rustdoc-ui/remap-path-prefix-passed-doctest-output.rs
new file mode 100644
index 00000000000..c58f3faeb53
--- /dev/null
+++ b/tests/rustdoc-ui/remap-path-prefix-passed-doctest-output.rs
@@ -0,0 +1,14 @@
+//@ check-pass
+//@ check-run-results
+
+// FIXME: if/when the output of the test harness can be tested on its own, this test should be
+// adapted to use that, and that normalize line can go away
+
+//@ compile-flags:--test -Z unstable-options --remap-path-prefix={{src-base}}=remapped_path --test-args --test-threads=1
+//@ normalize-stdout-test "finished in \d+\.\d+s" -> "finished in $$TIME"
+
+// doctest passes at runtime
+/// ```
+/// assert!(true);
+/// ```
+pub struct SomeStruct;
diff --git a/tests/rustdoc-ui/remap-path-prefix-passed-doctest-output.stdout b/tests/rustdoc-ui/remap-path-prefix-passed-doctest-output.stdout
new file mode 100644
index 00000000000..8ffb5694885
--- /dev/null
+++ b/tests/rustdoc-ui/remap-path-prefix-passed-doctest-output.stdout
@@ -0,0 +1,6 @@
+
+running 1 test
+test remapped_path/remap-path-prefix-passed-doctest-output.rs - SomeStruct (line 11) ... ok
+
+test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in $TIME
+