From 5d3c563d469ef36ce5a01f1612f53883fee20db5 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sat, 25 May 2024 10:02:21 -0700 Subject: [PATCH] Document tuple impls as fake variadic --- serde/src/de/impls.rs | 31 ++++++++++++++++++++++++++----- serde/src/lib.rs | 3 ++- serde/src/ser/impls.rs | 26 ++++++++++++++++++++++---- 3 files changed, 50 insertions(+), 10 deletions(-) diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index f26b20d46..4f71a20e5 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -1393,7 +1393,19 @@ array_impls! { macro_rules! tuple_impls { ($($len:tt => ($($n:tt $name:ident)+))+) => { $( - impl<'de, $($name: Deserialize<'de>),+> Deserialize<'de> for ($($name,)+) { + #[cfg_attr(docsrs, doc(hidden))] + impl<'de, $($name),+> Deserialize<'de> for ($($name,)+) + where + $($name: Deserialize<'de>,)+ + { + tuple_impl_body!($len => ($($n $name)+)); + } + )+ + }; +} + +macro_rules! tuple_impl_body { + ($len:tt => ($($n:tt $name:ident)+)) => { #[inline] fn deserialize(deserializer: D) -> Result where @@ -1462,13 +1474,22 @@ macro_rules! tuple_impls { deserializer.deserialize_tuple($len, TupleInPlaceVisitor(place)) } - } - )+ - } + }; +} + +#[cfg_attr(docsrs, doc(fake_variadic))] +#[cfg_attr( + docsrs, + doc = "This trait is implemented for tuples up to 16 items long." +)] +impl<'de, T> Deserialize<'de> for (T,) +where + T: Deserialize<'de>, +{ + tuple_impl_body!(1 => (0 T)); } tuple_impls! { - 1 => (0 T0) 2 => (0 T0 1 T1) 3 => (0 T0 1 T1 2 T2) 4 => (0 T0 1 T1 2 T2 3 T3) diff --git a/serde/src/lib.rs b/serde/src/lib.rs index 3185d340e..d2eeca162 100644 --- a/serde/src/lib.rs +++ b/serde/src/lib.rs @@ -99,7 +99,8 @@ // Support using Serde without the standard library! #![cfg_attr(not(feature = "std"), no_std)] // Show which crate feature enables conditionally compiled APIs in documentation. -#![cfg_attr(docsrs, feature(doc_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg, rustdoc_internals))] +#![cfg_attr(docsrs, allow(internal_features))] // Unstable functionality only if the user asks for it. For tracking and // discussion of these features please refer to this issue: // diff --git a/serde/src/ser/impls.rs b/serde/src/ser/impls.rs index 70711afd4..c3a6215ad 100644 --- a/serde/src/ser/impls.rs +++ b/serde/src/ser/impls.rs @@ -386,10 +386,19 @@ impl Serialize for ! { macro_rules! tuple_impls { ($($len:expr => ($($n:tt $name:ident)+))+) => { $( + #[cfg_attr(docsrs, doc(hidden))] impl<$($name),+> Serialize for ($($name,)+) where $($name: Serialize,)+ { + tuple_impl_body!($len => ($($n)+)); + } + )+ + }; +} + +macro_rules! tuple_impl_body { + ($len:expr => ($($n:tt)+)) => { #[inline] fn serialize(&self, serializer: S) -> Result where @@ -401,13 +410,22 @@ macro_rules! tuple_impls { )+ tuple.end() } - } - )+ - } + }; +} + +#[cfg_attr(docsrs, doc(fake_variadic))] +#[cfg_attr( + docsrs, + doc = "This trait is implemented for tuples up to 16 items long." +)] +impl Serialize for (T,) +where + T: Serialize, +{ + tuple_impl_body!(1 => (0)); } tuple_impls! { - 1 => (0 T0) 2 => (0 T0 1 T1) 3 => (0 T0 1 T1 2 T2) 4 => (0 T0 1 T1 2 T2 3 T3)