Skip to contentSkip to conversation

rust: doctest: fix incorrect pattern in replacement

PATCH Applied Gary Guo 2 participants 4 messages Jun 16 – Jun 19

Subsystems (3)
lore
Share & tools
lore

Gary Guo

author
#0 lore raw

PATCH v2 1/2 rust: doctest: fix incorrect pattern in replacement

From: Gary Guo <[email protected]>

The -> Result<(), impl core::fmt::Debug> string is generated by rustdoc and by adding "::" into the string it no longer finds anything, and making the line useless.

Remove the "::" in the pattern. Omit it in the replacement too, for consistency with upstream rustdoc.

Fixes de7cd3e4d638 ("rust: use absolute paths in macros referencing core and kernel")

--
Changes in v2:
- Update comments too
- Stops using :: in the replacement too to be consistent with upstream rustdoc

---
 scripts/rustdoc_test_builder.rs | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)
scripts/rustdoc_test_builder.rs +8 -6
index f7540bcf595a..5457679c12f9 100644
@@ -28,7 +28,7 @@ fn main() {
     //
     // ```
     // fn main() { #[allow(non_snake_case)] fn _doctest_main_rust_kernel_file_rs_28_0() {
-    // fn main() { #[allow(non_snake_case)] fn _doctest_main_rust_kernel_file_rs_37_0() -> Result<(), impl ::core::fmt::Debug> {
+    // fn main() { #[allow(non_snake_case)] fn _doctest_main_rust_kernel_file_rs_37_0() -> Result<(), impl core::fmt::Debug> {
     // ```
     //
     // It should be unlikely that doctest code matches such lines (when code is formatted properly).
@@ -47,12 +47,14 @@ fn main() {
         })
         .expect("No test function found in `rustdoc`'s output.");
 
-    // Qualify `Result` to avoid the collision with our own `Result` coming from the prelude.
+    // Replicate rustdoc 1.87+ behaviour by fully qualify `Result` (to avoid the collision with our
+    // own `Result` coming from the prelude).
+    //
+    // TODO: Remove this when MSRV is bumped above 1.87.
     let body = body.replace(
-        &format!("{rustdoc_function_name}() -> Result<(), impl ::core::fmt::Debug> {{"),
-        &format!(
-            "{rustdoc_function_name}() -> ::core::result::Result<(), impl ::core::fmt::Debug> {{"
-        ),
+        &format!("{rustdoc_function_name}() -> Result<(), impl core::fmt::Debug> {{"),
+        // This intentionally does not use absolute paths to match rustdoc 1.87 behaviour.
+        &format!("{rustdoc_function_name}() -> core::result::Result<(), impl core::fmt::Debug> {{"),
     );
 
     // For tests that get generated with `Result`, like above, `rustdoc` generates an `unwrap()` on

base-commit: c425609d6ac4012c8bbf01ec2e10e801b1923a7b
prerequisite-patch-id: 0000000000000000000000000000000000000000

Signature · 1 line
2.54.0
author
#1 lore raw

PATCH v2 2/2 rust: doctest: trim function name for reproducbility

From: Gary Guo <[email protected]>

Currently rustdoc will generate function names like "_doctest_main__home_gary_Projects_linux_rust_kernel_io_rs_824_0" for a doctest located at rust/kernel/io.rs:824, when building with separate outdir using O=. This creates overlong symbol names and is also not reproducible.

Fix it by doing a custom remapping to trim it to something like _doctest_main_rust_kernel_io_rs_824_0.

---
Changes in v2:
- Do an unconditional replacement to cover all cases.

---
 scripts/rustdoc_test_builder.rs | 5 +++++
 1 file changed, 5 insertions(+)
scripts/rustdoc_test_builder.rs +5 -0
index 5457679c12f9..79cef75f5af3 100644
@@ -70,6 +70,11 @@ fn main() {
     // Figure out a smaller test name based on the generated function name.
     let name = rustdoc_function_name.split_once("_rust_kernel_").unwrap().1;
 
+    // The rustdoc function name can include the absolute path when building with `O=` which is
+    // undesireable and create overlong symbol names. Remap it to use relative path.
+    let trimmed_function_name = format!("_doctest_main_rust_kernel_{name}");
+    let body = body.replace(&rustdoc_function_name, &trimmed_function_name);
+
     let path = format!("rust/test/doctests/kernel/{name}");
 
     std::fs::write(path, body.as_bytes()).unwrap();
Signature · 1 line
2.54.0
Applied
#2 lore raw
In reply to Gary Guo
Quoted 10 lines · Gary Guo

The -> Result<(), impl core::fmt::Debug> string is generated by rustdoc and by adding "::" into the string it no longer finds anything, and making the line useless.

Remove the "::" in the pattern. Omit it in the replacement too, for consistency with upstream rustdoc.

Fixes de7cd3e4d638 ("rust: use absolute paths in macros referencing core and kernel")

Applied to rust-fixes -- thanks!

[ Improved comments for consistency. Reworded to drop changelog and to
fix typo. - Miguel ]

While it doesn't happen to hurt much at the moment, the change here was not intended and we should be able to easily backport it, so:

Cheers,
Miguel

#3 lore raw
Quoted 3 lines · Miguel Ojeda

[ Improved comments for consistency. Reworded to drop changelog and to
fix typo. - Miguel ]

Actually, I just added a link to the comment to the upstream rustdoc PR for context.

Cheers,
Miguel