Rollup merge of #109919 - fmease:rustdoc-fix-issue-109488, r=notriddle
rustdoc: escape GAT args in more cases Fixes #109488. Previously we printed the *un*escaped form of GAT arguments not only when `f.alternate()` was true but *also* when we failed to compute the URL of the trait associated with the type projection, i.e. when `href(…)` returned an `Err(_)`. In this PR the argument printing logic is entirely separate from the link resolution code above as it should be. Further, we now only try to compute the URL if the HTML format was requested with `!f.alternate()`. Before, we would sometimes compute the `href` only to throw it away later.
This commit is contained in:
commit
72e535ea99
@ -1142,22 +1142,21 @@ fn fmt_type<'cx>(
|
||||
// the ugliness comes from inlining across crates where
|
||||
// everything comes in as a fully resolved QPath (hard to
|
||||
// look at).
|
||||
match href(trait_.def_id(), cx) {
|
||||
Ok((ref url, _, ref path)) if !f.alternate() => {
|
||||
write!(
|
||||
f,
|
||||
"<a class=\"associatedtype\" href=\"{url}#{shortty}.{name}\" \
|
||||
title=\"type {path}::{name}\">{name}</a>{args}",
|
||||
url = url,
|
||||
shortty = ItemType::AssocType,
|
||||
name = assoc.name,
|
||||
path = join_with_double_colon(path),
|
||||
args = assoc.args.print(cx),
|
||||
)?;
|
||||
}
|
||||
_ => write!(f, "{}{:#}", assoc.name, assoc.args.print(cx))?,
|
||||
}
|
||||
Ok(())
|
||||
if !f.alternate() && let Ok((url, _, path)) = href(trait_.def_id(), cx) {
|
||||
write!(
|
||||
f,
|
||||
"<a class=\"associatedtype\" href=\"{url}#{shortty}.{name}\" \
|
||||
title=\"type {path}::{name}\">{name}</a>",
|
||||
shortty = ItemType::AssocType,
|
||||
name = assoc.name,
|
||||
path = join_with_double_colon(&path),
|
||||
)
|
||||
} else {
|
||||
write!(f, "{}", assoc.name)
|
||||
}?;
|
||||
|
||||
// Carry `f.alternate()` into this display w/o branching manually.
|
||||
fmt::Display::fmt(&assoc.args.print(cx), f)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
18
tests/rustdoc/generic-associated-types/issue-109488.rs
Normal file
18
tests/rustdoc/generic-associated-types/issue-109488.rs
Normal file
@ -0,0 +1,18 @@
|
||||
// Make sure that we escape the arguments of the GAT projection even if we fail to compute
|
||||
// the href of the corresponding trait (in this case it is private).
|
||||
// Further, test that we also linkify the GAT arguments.
|
||||
|
||||
// @has 'issue_109488/type.A.html'
|
||||
// @has - '//pre[@class="rust item-decl"]' '<S as Tr>::P<Option<i32>>'
|
||||
// @has - '//pre[@class="rust item-decl"]//a[@class="enum"]/@href' '{{channel}}/core/option/enum.Option.html'
|
||||
pub type A = <S as Tr>::P<Option<i32>>;
|
||||
|
||||
/*private*/ trait Tr {
|
||||
type P<T>;
|
||||
}
|
||||
|
||||
pub struct S;
|
||||
|
||||
impl Tr for S {
|
||||
type P<T> = ();
|
||||
}
|
Loading…
Reference in New Issue
Block a user