Skip to content

Commit

Permalink
Rollup merge of #109919 - fmease:rustdoc-fix-issue-109488, r=notriddle
Browse files Browse the repository at this point in the history
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 above link resolution code 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.
  • Loading branch information
aliemjay authored Apr 4, 2023
2 parents 9e3103b + 6567bc9 commit bb5c182
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 16 deletions.
31 changes: 15 additions & 16 deletions src/librustdoc/html/format.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
}
Expand Down
18 changes: 18 additions & 0 deletions tests/rustdoc/generic-associated-types/issue-109488.rs
Original file line number Diff line number Diff line change
@@ -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> = ();
}

0 comments on commit bb5c182

Please sign in to comment.