Skip to content

Commit 4ef35bc

Browse files
committed
rustdoc: use descriptive tooltip if doctest is conditionally ignored
fixes rust-lang#141092
1 parent 038d599 commit 4ef35bc

File tree

3 files changed

+64
-10
lines changed

3 files changed

+64
-10
lines changed

src/librustdoc/html/highlight.rs

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//! Use the `render_with_highlighting` to highlight some rust code.
77
88
use std::collections::VecDeque;
9-
use std::fmt::{Display, Write};
9+
use std::fmt::{self, Display, Write};
1010

1111
use rustc_data_structures::fx::FxIndexMap;
1212
use rustc_lexer::{Cursor, FrontmatterAllowed, LiteralKind, TokenKind};
@@ -36,9 +36,10 @@ pub(crate) struct HrefContext<'a, 'tcx> {
3636
#[derive(Default)]
3737
pub(crate) struct DecorationInfo(pub(crate) FxIndexMap<&'static str, Vec<(u32, u32)>>);
3838

39-
#[derive(Eq, PartialEq, Clone, Copy)]
39+
#[derive(Eq, PartialEq, Clone)]
4040
pub(crate) enum Tooltip {
41-
Ignore,
41+
IgnoreAll,
42+
IgnoreSome(Vec<String>),
4243
CompileFail,
4344
ShouldPanic,
4445
Edition(Edition),
@@ -70,7 +71,7 @@ fn write_header(
7071
format_args!(
7172
"<div class=\"example-wrap{}\">",
7273
match tooltip {
73-
Tooltip::Ignore => " ignore",
74+
Tooltip::IgnoreAll | Tooltip::IgnoreSome(_) => " ignore",
7475
Tooltip::CompileFail => " compile_fail",
7576
Tooltip::ShouldPanic => " should_panic",
7677
Tooltip::Edition(_) => " edition",
@@ -80,18 +81,46 @@ fn write_header(
8081
);
8182

8283
if tooltip != Tooltip::None {
83-
let edition_code;
84+
// variable for extending lifetimes of temporaries
85+
let tmp;
8486
write_str(
8587
out,
8688
format_args!(
8789
"<a href=\"#\" class=\"tooltip\" title=\"{}\">ⓘ</a>",
8890
match tooltip {
89-
Tooltip::Ignore => "This example is not tested",
91+
Tooltip::IgnoreAll => "This example is not tested",
92+
Tooltip::IgnoreSome(platforms) => {
93+
tmp = format!(
94+
"This example is not tested on {}",
95+
fmt::from_fn(|f| {
96+
match platforms.len() {
97+
0 => unreachable!(),
98+
1 => f.write_str(&platforms[0]),
99+
2 => write!(f, "{} or {}", &platforms[0], &platforms[1]),
100+
_ => {
101+
for (i, plat) in platforms.iter().enumerate() {
102+
match (platforms.len() - 2).cmp(&i) {
103+
std::cmp::Ordering::Greater => {
104+
write!(f, "{}, ", plat)?
105+
}
106+
std::cmp::Ordering::Equal => {
107+
write!(f, "{}, or ", plat)?
108+
}
109+
std::cmp::Ordering::Less => f.write_str(&plat)?,
110+
}
111+
}
112+
Ok(())
113+
}
114+
}
115+
})
116+
);
117+
&tmp
118+
}
90119
Tooltip::CompileFail => "This example deliberately fails to compile",
91120
Tooltip::ShouldPanic => "This example panics",
92121
Tooltip::Edition(edition) => {
93-
edition_code = format!("This example runs with edition {edition}");
94-
&edition_code
122+
tmp = format!("This example runs with edition {edition}");
123+
&tmp
95124
}
96125
Tooltip::None => unreachable!(),
97126
}

src/librustdoc/html/markdown.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -320,8 +320,10 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for CodeBlocks<'_, 'a, I> {
320320
))
321321
});
322322

323-
let tooltip = if ignore != Ignore::None {
324-
highlight::Tooltip::Ignore
323+
let tooltip = if ignore == Ignore::All {
324+
highlight::Tooltip::IgnoreAll
325+
} else if let Ignore::Some(platforms) = ignore {
326+
highlight::Tooltip::IgnoreSome(platforms)
325327
} else if compile_fail {
326328
highlight::Tooltip::CompileFail
327329
} else if should_panic {
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#![crate_name = "foo"]
2+
3+
// test for https://github.com/rust-lang/rust/issues/141092
4+
5+
//@ has 'foo/fn.f.html' '//a[@title="This example is not tested on wasm"]' 'ⓘ'
6+
/// Example
7+
///
8+
/// ```ignore-wasm
9+
/// let x = 1;
10+
/// ```
11+
pub fn f() {}
12+
13+
//@ has 'foo/fn.g.html' '//a[@title="This example is not tested on wasm or windows"]' 'ⓘ'
14+
/// ```ignore-wasm,ignore-windows
15+
/// let x = 1;
16+
/// ```
17+
pub fn g() {}
18+
19+
//@ has 'foo/fn.h.html' '//a[@title="This example is not tested on wasm, windows, or unix"]' 'ⓘ'
20+
/// ```ignore-wasm,ignore-windows,ignore-unix
21+
/// let x = 1;
22+
/// ```
23+
pub fn h() {}

0 commit comments

Comments
 (0)