Remove `extension_trait`.

At this point, `extension_trait` is basically an expensive no-op. This
commit removes it. The next commit will adjust the indentation.
pull/1006/head
Nicholas Nethercote 3 years ago
parent 2dde8820fa
commit 1146c66f1b

@ -22,7 +22,6 @@ cfg_unstable_default! {
pub use core::future::Future as Future;
extension_trait! {
#[doc = r#"
Extension methods for [`Future`].
@ -45,7 +44,7 @@ extension_trait! {
/// ```
#[cfg(feature = "unstable")]
#[cfg_attr(feature = "docs", doc(cfg(unstable)))]
fn delay(self, dur: Duration) -> [DelayFuture<Self>]
fn delay(self, dur: Duration) -> DelayFuture<Self>
where
Self: Sized,
{
@ -70,7 +69,7 @@ extension_trait! {
#[cfg_attr(feature = "docs", doc(cfg(unstable)))]
fn flatten(
self,
) -> [FlattenFuture<Self, <Self::Output as IntoFuture>::Future>]
) -> FlattenFuture<Self, <Self::Output as IntoFuture>::Future>
where
Self: Sized,
<Self as Future>::Output: IntoFuture,
@ -112,7 +111,7 @@ extension_trait! {
fn race<F>(
self,
other: F,
) -> [Race<Self, F>]
) -> Race<Self, F>
where
Self: std::future::Future + Sized,
F: std::future::Future<Output = <Self as std::future::Future>::Output>,
@ -158,7 +157,7 @@ extension_trait! {
fn try_race<F, T, E>(
self,
other: F
) -> [TryRace<Self, F>]
) -> TryRace<Self, F>
where
Self: std::future::Future<Output = Result<T, E>> + Sized,
F: std::future::Future<Output = <Self as std::future::Future>::Output>,
@ -195,7 +194,7 @@ extension_trait! {
fn join<F>(
self,
other: F
) -> [Join<Self, F>]
) -> Join<Self, F>
where
Self: std::future::Future + Sized,
F: std::future::Future,
@ -242,7 +241,7 @@ extension_trait! {
fn try_join<F, A, B, E>(
self,
other: F
) -> [TryJoin<Self, F>]
) -> TryJoin<Self, F>
where
Self: std::future::Future<Output = Result<A, E>> + Sized,
F: std::future::Future<Output = Result<B, E>>,
@ -278,13 +277,12 @@ extension_trait! {
"#]
#[cfg(any(all(feature = "default", feature = "unstable"), feature = "docs"))]
#[cfg_attr(feature = "docs", doc(cfg(unstable)))]
fn timeout(self, dur: Duration) -> [TimeoutFuture<Self>]
fn timeout(self, dur: Duration) -> TimeoutFuture<Self>
where Self: Sized
{
TimeoutFuture::new(self, dur)
}
}
}
impl<T: Future + ?Sized> FutureExt for T {}

@ -17,7 +17,6 @@ use crate::task::{Context, Poll};
pub use futures_io::AsyncBufRead as BufRead;
extension_trait! {
#[doc = r#"
Extension methods for [`BufRead`].
@ -78,7 +77,7 @@ extension_trait! {
&'a mut self,
byte: u8,
buf: &'a mut Vec<u8>,
) -> [ReadUntilFuture<'a, Self>]
) -> ReadUntilFuture<'a, Self>
where
Self: Unpin,
{
@ -131,7 +130,7 @@ extension_trait! {
fn read_line<'a>(
&'a mut self,
buf: &'a mut String,
) -> [ReadLineFuture<'a, Self>]
) -> ReadLineFuture<'a, Self>
where
Self: Unpin,
{
@ -237,7 +236,6 @@ extension_trait! {
}
}
}
}
impl<T: BufRead + ?Sized> BufReadExt for T {}

@ -23,7 +23,6 @@ pub use take::Take;
pub use futures_io::AsyncRead as Read;
extension_trait! {
#[doc = r#"
Extension methods for [`Read`].
@ -64,7 +63,7 @@ extension_trait! {
fn read<'a>(
&'a mut self,
buf: &'a mut [u8],
) -> [ReadFuture<'a, Self>]
) -> ReadFuture<'a, Self>
where
Self: Unpin
{
@ -86,7 +85,7 @@ extension_trait! {
fn read_vectored<'a>(
&'a mut self,
bufs: &'a mut [IoSliceMut<'a>],
) -> [ReadVectoredFuture<'a, Self>]
) -> ReadVectoredFuture<'a, Self>
where
Self: Unpin,
{
@ -123,7 +122,7 @@ extension_trait! {
fn read_to_end<'a>(
&'a mut self,
buf: &'a mut Vec<u8>,
) -> [ReadToEndFuture<'a, Self>]
) -> ReadToEndFuture<'a, Self>
where
Self: Unpin,
{
@ -162,7 +161,7 @@ extension_trait! {
fn read_to_string<'a>(
&'a mut self,
buf: &'a mut String,
) -> [ReadToStringFuture<'a, Self>]
) -> ReadToStringFuture<'a, Self>
where
Self: Unpin,
{
@ -217,7 +216,7 @@ extension_trait! {
fn read_exact<'a>(
&'a mut self,
buf: &'a mut [u8],
) -> [ReadExactFuture<'a, Self>]
) -> ReadExactFuture<'a, Self>
where
Self: Unpin,
{
@ -373,7 +372,6 @@ extension_trait! {
Chain { first: self, second: next, done_first: false }
}
}
}
impl<T: Read + ?Sized> ReadExt for T {}

@ -6,7 +6,6 @@ use crate::io::SeekFrom;
pub use futures_io::AsyncSeek as Seek;
extension_trait! {
#[doc = r#"
Extension methods for [`Seek`].
@ -40,13 +39,12 @@ extension_trait! {
fn seek(
&mut self,
pos: SeekFrom,
) -> [SeekFuture<'_, Self>]
) -> SeekFuture<'_, Self>
where
Self: Unpin,
{
SeekFuture { seeker: self, pos }
}
}
}
impl<T: Seek + ?Sized> SeekExt for T {}

@ -14,7 +14,6 @@ use crate::io::{self, IoSlice};
pub use futures_io::AsyncWrite as Write;
extension_trait! {
#[doc = r#"
Extension methods for [`Write`].
@ -49,7 +48,7 @@ extension_trait! {
fn write<'a>(
&'a mut self,
buf: &'a [u8],
) -> [WriteFuture<'a, Self>]
) -> WriteFuture<'a, Self>
where
Self: Unpin,
{
@ -75,7 +74,7 @@ extension_trait! {
# Ok(()) }) }
```
"#]
fn flush(&mut self) -> [FlushFuture<'_, Self>]
fn flush(&mut self) -> FlushFuture<'_, Self>
where
Self: Unpin,
{
@ -97,7 +96,7 @@ extension_trait! {
fn write_vectored<'a>(
&'a mut self,
bufs: &'a [IoSlice<'a>],
) -> [WriteVectoredFuture<'a, Self>]
) -> WriteVectoredFuture<'a, Self>
where
Self: Unpin,
{
@ -133,7 +132,7 @@ extension_trait! {
fn write_all<'a>(
&'a mut self,
buf: &'a [u8],
) -> [WriteAllFuture<'a, Self>]
) -> WriteAllFuture<'a, Self>
where
Self: Unpin,
{
@ -170,7 +169,7 @@ extension_trait! {
fn write_fmt<'a>(
&'a mut self,
fmt: std::fmt::Arguments<'_>,
) -> [WriteFmtFuture<'a, Self>]
) -> WriteFmtFuture<'a, Self>
where
Self: Unpin,
{
@ -184,6 +183,5 @@ extension_trait! {
WriteFmtFuture { writer: self, res: Some(res), buffer: None, amt: 0 }
}
}
}
impl<T: Write + ?Sized> WriteExt for T {}

@ -145,7 +145,6 @@ cfg_unstable! {
pub use futures_core::stream::Stream as Stream;
extension_trait! {
#[doc = r#"
Extension methods for [`Stream`].
@ -177,7 +176,7 @@ extension_trait! {
# }) }
```
"#]
fn next(&mut self) -> [NextFuture<'_, Self>]
fn next(&mut self) -> NextFuture<'_, Self>
where
Self: Unpin,
{
@ -629,7 +628,7 @@ extension_trait! {
"#]
fn last(
self,
) -> [LastFuture<Self, Self::Item>]
) -> LastFuture<Self, Self::Item>
where
Self: Sized,
{
@ -839,7 +838,7 @@ extension_trait! {
fn min_by_key<B, F>(
self,
key_by: F,
) -> [MinByKeyFuture<Self, Self::Item, F>]
) -> MinByKeyFuture<Self, Self::Item, F>
where
Self: Sized,
B: Ord,
@ -875,7 +874,7 @@ extension_trait! {
fn max_by_key<B, F>(
self,
key_by: F,
) -> [MaxByKeyFuture<Self, Self::Item, F>]
) -> MaxByKeyFuture<Self, Self::Item, F>
where
Self: Sized,
B: Ord,
@ -914,7 +913,7 @@ extension_trait! {
fn min_by<F>(
self,
compare: F,
) -> [MinByFuture<Self, F, Self::Item>]
) -> MinByFuture<Self, F, Self::Item>
where
Self: Sized,
F: FnMut(&Self::Item, &Self::Item) -> Ordering,
@ -947,7 +946,7 @@ extension_trait! {
"#]
fn max(
self,
) -> [MaxFuture<Self, Self::Item>]
) -> MaxFuture<Self, Self::Item>
where
Self: Sized,
Self::Item: Ord,
@ -980,7 +979,7 @@ extension_trait! {
"#]
fn min(
self,
) -> [MinFuture<Self, Self::Item>]
) -> MinFuture<Self, Self::Item>
where
Self: Sized,
Self::Item: Ord,
@ -1018,7 +1017,7 @@ extension_trait! {
fn max_by<F>(
self,
compare: F,
) -> [MaxByFuture<Self, F, Self::Item>]
) -> MaxByFuture<Self, F, Self::Item>
where
Self: Sized,
F: FnMut(&Self::Item, &Self::Item) -> Ordering,
@ -1082,7 +1081,7 @@ extension_trait! {
fn nth(
&mut self,
n: usize,
) -> [NthFuture<'_, Self>]
) -> NthFuture<'_, Self>
where
Self: Unpin + Sized,
{
@ -1138,7 +1137,7 @@ extension_trait! {
fn all<F>(
&mut self,
f: F,
) -> [AllFuture<'_, Self, F, Self::Item>]
) -> AllFuture<'_, Self, F, Self::Item>
where
Self: Unpin + Sized,
F: FnMut(Self::Item) -> bool,
@ -1187,7 +1186,7 @@ extension_trait! {
fn find<P>(
&mut self,
p: P,
) -> [FindFuture<'_, Self, P>]
) -> FindFuture<'_, Self, P>
where
Self: Unpin + Sized,
P: FnMut(&Self::Item) -> bool,
@ -1215,7 +1214,7 @@ extension_trait! {
fn find_map<F, B>(
&mut self,
f: F,
) -> [FindMapFuture<'_, Self, F>]
) -> FindMapFuture<'_, Self, F>
where
Self: Unpin + Sized,
F: FnMut(Self::Item) -> Option<B>,
@ -1249,7 +1248,7 @@ extension_trait! {
self,
init: B,
f: F,
) -> [FoldFuture<Self, F, B>]
) -> FoldFuture<Self, F, B>
where
Self: Sized,
F: FnMut(B, Self::Item) -> B,
@ -1286,7 +1285,7 @@ extension_trait! {
fn partition<B, F>(
self,
f: F,
) -> [PartitionFuture<Self, F, B>]
) -> PartitionFuture<Self, F, B>
where
Self: Sized,
F: FnMut(&Self::Item) -> bool,
@ -1322,7 +1321,7 @@ extension_trait! {
fn for_each<F>(
self,
f: F,
) -> [ForEachFuture<Self, F>]
) -> ForEachFuture<Self, F>
where
Self: Sized,
F: FnMut(Self::Item),
@ -1378,7 +1377,7 @@ extension_trait! {
fn any<F>(
&mut self,
f: F,
) -> [AnyFuture<'_, Self, F, Self::Item>]
) -> AnyFuture<'_, Self, F, Self::Item>
where
Self: Unpin + Sized,
F: FnMut(Self::Item) -> bool,
@ -1614,7 +1613,7 @@ extension_trait! {
&mut self,
init: T,
f: F,
) -> [TryFoldFuture<'_, Self, F, T>]
) -> TryFoldFuture<'_, Self, F, T>
where
Self: Unpin + Sized,
F: FnMut(B, Self::Item) -> Result<T, E>,
@ -1659,7 +1658,7 @@ extension_trait! {
fn try_for_each<F, E>(
&mut self,
f: F,
) -> [TryForEachFuture<'_, Self, F>]
) -> TryForEachFuture<'_, Self, F>
where
Self: Unpin + Sized,
F: FnMut(Self::Item) -> Result<(), E>,
@ -1741,7 +1740,7 @@ extension_trait! {
"#]
#[cfg(feature = "unstable")]
#[cfg_attr(feature = "docs", doc(cfg(unstable)))]
fn unzip<A, B, FromA, FromB>(self) -> [UnzipFuture<Self, FromA, FromB>]
fn unzip<A, B, FromA, FromB>(self) -> UnzipFuture<Self, FromA, FromB>
where
FromA: Default + Extend<A>,
FromB: Default + Extend<B>,
@ -1805,7 +1804,7 @@ extension_trait! {
#[cfg_attr(feature = "docs", doc(cfg(unstable)))]
fn collect<'a, B>(
self,
) -> [Pin<Box<dyn Future<Output = B> + 'a + Send>>]
) -> Pin<Box<dyn Future<Output = B> + 'a + Send>>
where
Self: Sized + 'a + Send,
B: FromStream<Self::Item>,
@ -1879,7 +1878,7 @@ extension_trait! {
fn partial_cmp<S>(
self,
other: S
) -> [PartialCmpFuture<Self, S>]
) -> PartialCmpFuture<Self, S>
where
Self: Sized + Stream,
S: Stream,
@ -1919,7 +1918,7 @@ extension_trait! {
fn position<P>(
&mut self,
predicate: P,
) -> [PositionFuture<'_, Self, P>]
) -> PositionFuture<'_, Self, P>
where
Self: Unpin + Sized,
P: FnMut(Self::Item) -> bool,
@ -1957,7 +1956,7 @@ extension_trait! {
fn cmp<S>(
self,
other: S
) -> [CmpFuture<Self, S>]
) -> CmpFuture<Self, S>
where
Self: Sized + Stream,
S: Stream,
@ -1988,7 +1987,7 @@ extension_trait! {
"#]
#[cfg(feature = "unstable")]
#[cfg_attr(feature = "docs", doc(cfg(unstable)))]
fn count(self) -> [CountFuture<Self>]
fn count(self) -> CountFuture<Self>
where
Self: Sized,
{
@ -2023,7 +2022,7 @@ extension_trait! {
fn ne<S>(
self,
other: S
) -> [NeFuture<Self, S>]
) -> NeFuture<Self, S>
where
Self: Sized,
S: Sized + Stream,
@ -2060,7 +2059,7 @@ extension_trait! {
fn ge<S>(
self,
other: S
) -> [GeFuture<Self, S>]
) -> GeFuture<Self, S>
where
Self: Sized + Stream,
S: Stream,
@ -2097,7 +2096,7 @@ extension_trait! {
fn eq<S>(
self,
other: S
) -> [EqFuture<Self, S>]
) -> EqFuture<Self, S>
where
Self: Sized + Stream,
S: Sized + Stream,
@ -2134,7 +2133,7 @@ extension_trait! {
fn gt<S>(
self,
other: S
) -> [GtFuture<Self, S>]
) -> GtFuture<Self, S>
where
Self: Sized + Stream,
S: Stream,
@ -2171,7 +2170,7 @@ extension_trait! {
fn le<S>(
self,
other: S
) -> [LeFuture<Self, S>]
) -> LeFuture<Self, S>
where
Self: Sized + Stream,
S: Stream,
@ -2208,7 +2207,7 @@ extension_trait! {
fn lt<S>(
self,
other: S
) -> [LtFuture<Self, S>]
) -> LtFuture<Self, S>
where
Self: Sized + Stream,
S: Stream,
@ -2252,7 +2251,7 @@ extension_trait! {
#[cfg_attr(feature = "docs", doc(cfg(unstable)))]
fn sum<'a, S>(
self,
) -> [Pin<Box<dyn Future<Output = S> + 'a>>]
) -> Pin<Box<dyn Future<Output = S> + 'a>>
where
Self: Sized + Stream<Item = S> + 'a,
S: Sum<Self::Item>,
@ -2298,7 +2297,7 @@ extension_trait! {
#[cfg_attr(feature = "docs", doc(cfg(unstable)))]
fn product<'a, P>(
self,
) -> [Pin<Box<dyn Future<Output = P> + 'a>>]
) -> Pin<Box<dyn Future<Output = P> + 'a>>
where
Self: Sized + Stream<Item = P> + 'a,
P: Product,
@ -2306,7 +2305,6 @@ extension_trait! {
Product::product(self)
}
}
}
impl<T: Stream + ?Sized> StreamExt for T {}

@ -233,41 +233,3 @@ macro_rules! cfg_default {
)*
}
}
/// Defines an extension trait for a base trait.
///
/// In generated docs, the base trait will contain methods from the extension trait. In actual
/// code, the base trait will be re-exported and the extension trait will be hidden. We then
/// re-export the extension trait from the prelude.
///
/// Inside invocations of this macro, we write a definitions that looks similar to the final
/// rendered docs, and the macro then generates all the boilerplate for us.
#[allow(unused_macros)]
#[doc(hidden)]
macro_rules! extension_trait {
(
#[doc = $doc_ext:tt]
pub trait $ext:ident: $name:ident {
$($body_ext:tt)*
}
) => {
// The extension trait that adds methods to any type implementing the base trait.
#[doc = $doc_ext]
pub trait $ext: $name {
extension_trait!(@ext [$($body_ext)*] -> []);
}
};
// Parse the return type in an extension method.
(@ext [-> [$f:ty] $($tail:tt)*] -> [$($accum:tt)*]) => {
extension_trait!(@ext [$($tail)*] -> [$($accum)* -> $f]);
};
// Parse a token.
(@ext [$token:tt $($tail:tt)*] -> [$($accum:tt)*]) => {
extension_trait!(@ext [$($tail)*] -> [$($accum)* $token]);
};
// Handle the end of the token list.
(@ext [] -> [$($accum:tt)*]) => { $($accum)* };
}

Loading…
Cancel
Save