diff --git a/src/etc/htmldocck.py b/src/etc/htmldocck.py
index f762e38900552..70b6af717cd38 100644
--- a/src/etc/htmldocck.py
+++ b/src/etc/htmldocck.py
@@ -417,7 +417,7 @@ def check_snapshot(snapshot_name, actual_tree, normalize_to_text):
snapshot_path = '{}.{}.{}'.format(rust_test_path[:-3], snapshot_name, 'html')
try:
with open(snapshot_path, 'r') as snapshot_file:
- expected_str = snapshot_file.read()
+ expected_str = snapshot_file.read().replace("{{channel}}", channel)
except FileNotFoundError:
if bless:
expected_str = None
@@ -429,8 +429,6 @@ def check_snapshot(snapshot_name, actual_tree, normalize_to_text):
else:
actual_str = flatten(actual_tree)
- expected_str = expected_str.replace("{{channel}}", channel)
-
# Conditions:
# 1. Is --bless
# 2. Are actual and expected tree different
diff --git a/src/librustdoc/html/format.rs b/src/librustdoc/html/format.rs
index 0c0920ae63e4e..5baa53d55545f 100644
--- a/src/librustdoc/html/format.rs
+++ b/src/librustdoc/html/format.rs
@@ -23,6 +23,8 @@ use rustc_span::symbol::kw;
use rustc_span::{sym, Symbol};
use rustc_target::spec::abi::Abi;
+use itertools::Itertools;
+
use crate::clean::{
self, types::ExternalLocation, utils::find_nearest_parent_module, ExternalCrate, ItemId,
PrimitiveType,
@@ -874,20 +876,42 @@ fn fmt_type<'cx>(
match &typs[..] {
&[] => primitive_link(f, PrimitiveType::Unit, "()", cx),
&[ref one] => {
- primitive_link(f, PrimitiveType::Tuple, "(", cx)?;
- // Carry `f.alternate()` into this display w/o branching manually.
- fmt::Display::fmt(&one.print(cx), f)?;
- primitive_link(f, PrimitiveType::Tuple, ",)", cx)
+ if let clean::Generic(name) = one {
+ primitive_link(f, PrimitiveType::Tuple, &format!("({name},)"), cx)
+ } else {
+ write!(f, "(")?;
+ // Carry `f.alternate()` into this display w/o branching manually.
+ fmt::Display::fmt(&one.print(cx), f)?;
+ write!(f, ",)")
+ }
}
many => {
- primitive_link(f, PrimitiveType::Tuple, "(", cx)?;
- for (i, item) in many.iter().enumerate() {
- if i != 0 {
- write!(f, ", ")?;
+ let generic_names: Vec = many
+ .iter()
+ .filter_map(|t| match t {
+ clean::Generic(name) => Some(*name),
+ _ => None,
+ })
+ .collect();
+ let is_generic = generic_names.len() == many.len();
+ if is_generic {
+ primitive_link(
+ f,
+ PrimitiveType::Tuple,
+ &format!("({})", generic_names.iter().map(|s| s.as_str()).join(", ")),
+ cx,
+ )
+ } else {
+ write!(f, "(")?;
+ for (i, item) in many.iter().enumerate() {
+ if i != 0 {
+ write!(f, ", ")?;
+ }
+ // Carry `f.alternate()` into this display w/o branching manually.
+ fmt::Display::fmt(&item.print(cx), f)?;
}
- fmt::Display::fmt(&item.print(cx), f)?;
+ write!(f, ")")
}
- primitive_link(f, PrimitiveType::Tuple, ")", cx)
}
}
}
diff --git a/src/test/rustdoc/tuples.link1_i32.html b/src/test/rustdoc/tuples.link1_i32.html
new file mode 100644
index 0000000000000..4efde28ed52e7
--- /dev/null
+++ b/src/test/rustdoc/tuples.link1_i32.html
@@ -0,0 +1 @@
+pub fn tuple1(x: (i32,)) -> (i32,)
\ No newline at end of file
diff --git a/src/test/rustdoc/tuples.link1_t.html b/src/test/rustdoc/tuples.link1_t.html
new file mode 100644
index 0000000000000..1cbaec05733b5
--- /dev/null
+++ b/src/test/rustdoc/tuples.link1_t.html
@@ -0,0 +1 @@
+pub fn tuple1_t<T>(x: (T,)) -> (T,)
\ No newline at end of file
diff --git a/src/test/rustdoc/tuples.link2_i32.html b/src/test/rustdoc/tuples.link2_i32.html
new file mode 100644
index 0000000000000..77c8d81b842df
--- /dev/null
+++ b/src/test/rustdoc/tuples.link2_i32.html
@@ -0,0 +1 @@
+pub fn tuple2(x: (i32, i32)) -> (i32, i32)
\ No newline at end of file
diff --git a/src/test/rustdoc/tuples.link2_t.html b/src/test/rustdoc/tuples.link2_t.html
new file mode 100644
index 0000000000000..2477aa6be9d39
--- /dev/null
+++ b/src/test/rustdoc/tuples.link2_t.html
@@ -0,0 +1 @@
+pub fn tuple2_t<T>(x: (T, T)) -> (T, T)
\ No newline at end of file
diff --git a/src/test/rustdoc/tuples.link2_tu.html b/src/test/rustdoc/tuples.link2_tu.html
new file mode 100644
index 0000000000000..b02f8dd8d6530
--- /dev/null
+++ b/src/test/rustdoc/tuples.link2_tu.html
@@ -0,0 +1 @@
+pub fn tuple2_tu<T, U>(x: (T, U)) -> (T, U)
\ No newline at end of file
diff --git a/src/test/rustdoc/tuples.link_unit.html b/src/test/rustdoc/tuples.link_unit.html
new file mode 100644
index 0000000000000..839990e1587c6
--- /dev/null
+++ b/src/test/rustdoc/tuples.link_unit.html
@@ -0,0 +1 @@
+pub fn tuple0(x: ())
\ No newline at end of file
diff --git a/src/test/rustdoc/tuples.rs b/src/test/rustdoc/tuples.rs
index 53654abff2a8e..62e2f9e7ef244 100644
--- a/src/test/rustdoc/tuples.rs
+++ b/src/test/rustdoc/tuples.rs
@@ -1,8 +1,20 @@
#![crate_name = "foo"]
// @has foo/fn.tuple0.html //pre 'pub fn tuple0(x: ())'
+// @snapshot link_unit - '//pre[@class="rust fn"]/code'
pub fn tuple0(x: ()) -> () { x }
// @has foo/fn.tuple1.html //pre 'pub fn tuple1(x: (i32,)) -> (i32,)'
+// @snapshot link1_i32 - '//pre[@class="rust fn"]/code'
pub fn tuple1(x: (i32,)) -> (i32,) { x }
// @has foo/fn.tuple2.html //pre 'pub fn tuple2(x: (i32, i32)) -> (i32, i32)'
+// @snapshot link2_i32 - '//pre[@class="rust fn"]/code'
pub fn tuple2(x: (i32, i32)) -> (i32, i32) { x }
+// @has foo/fn.tuple1_t.html //pre 'pub fn tuple1_t(x: (T,)) -> (T,)'
+// @snapshot link1_t - '//pre[@class="rust fn"]/code'
+pub fn tuple1_t(x: (T,)) -> (T,) { x }
+// @has foo/fn.tuple2_t.html //pre 'pub fn tuple2_t(x: (T, T)) -> (T, T)'
+// @snapshot link2_t - '//pre[@class="rust fn"]/code'
+pub fn tuple2_t(x: (T, T)) -> (T, T) { x }
+// @has foo/fn.tuple2_tu.html //pre 'pub fn tuple2_tu(x: (T, U)) -> (T, U)'
+// @snapshot link2_tu - '//pre[@class="rust fn"]/code'
+pub fn tuple2_tu(x: (T, U)) -> (T, U) { x }