Skip to content

Commit

Permalink
rustdoc: escape GAT args in more cases
Browse files Browse the repository at this point in the history
  • Loading branch information
fmease committed Apr 4, 2023
1 parent 480068c commit 6567bc9
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 6567bc9

Please sign in to comment.