Skip to content

Commit 53b0067

Browse files
committed
Add FromIterator<TokenStream> for TokenStream
This was left out by accident! It'll already be avaialable in 1.29.0 Rust, so let's include it here as well.
1 parent 6aafb1a commit 53b0067

File tree

3 files changed

+56
-0
lines changed

3 files changed

+56
-0
lines changed

src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,11 @@ impl FromIterator<TokenTree> for TokenStream {
182182
TokenStream::_new(streams.into_iter().collect())
183183
}
184184
}
185+
impl FromIterator<TokenStream> for TokenStream {
186+
fn from_iter<I: IntoIterator<Item = TokenStream>>(streams: I) -> Self {
187+
TokenStream::_new(streams.into_iter().map(|i| i.inner).collect())
188+
}
189+
}
185190

186191
/// Prints the token stream as a string that is supposed to be losslessly
187192
/// convertible back into the same token stream (modulo spans), except for

src/stable.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,18 @@ impl iter::FromIterator<TokenTree> for TokenStream {
154154
}
155155
}
156156

157+
impl iter::FromIterator<TokenStream> for TokenStream {
158+
fn from_iter<I: IntoIterator<Item = TokenStream>>(streams: I) -> Self {
159+
let mut v = Vec::new();
160+
161+
for stream in streams.into_iter() {
162+
v.extend(stream.inner);
163+
}
164+
165+
TokenStream { inner: v }
166+
}
167+
}
168+
157169
impl Extend<TokenTree> for TokenStream {
158170
fn extend<I: IntoIterator<Item = TokenTree>>(&mut self, streams: I) {
159171
self.inner.extend(streams);

src/unstable.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,45 @@ impl iter::FromIterator<TokenTree> for TokenStream {
206206
}
207207
}
208208

209+
impl iter::FromIterator<TokenStream> for TokenStream {
210+
fn from_iter<I: IntoIterator<Item = TokenStream>>(streams: I) -> Self {
211+
let mut streams = streams.into_iter();
212+
match streams.next() {
213+
#[cfg(slow_extend)]
214+
Some(TokenStream::Nightly(first)) => {
215+
let stream = iter::once(first).chain(streams.map(|s| {
216+
match s {
217+
TokenStream::Nightly(s) => s,
218+
TokenStream::Stable(_) => mismatch(),
219+
}
220+
})).collect();
221+
TokenStream::Nightly(stream)
222+
}
223+
#[cfg(not(slow_extend))]
224+
Some(TokenStream::Nightly(mut first)) => {
225+
first.extend(streams.map(|s| {
226+
match s {
227+
TokenStream::Nightly(s) => s,
228+
TokenStream::Stable(_) => mismatch(),
229+
}
230+
}));
231+
TokenStream::Nightly(first)
232+
}
233+
Some(TokenStream::Stable(mut first)) => {
234+
first.extend(streams.map(|s| {
235+
match s {
236+
TokenStream::Stable(s) => s,
237+
TokenStream::Nightly(_) => mismatch(),
238+
}
239+
}));
240+
TokenStream::Stable(first)
241+
}
242+
None => TokenStream::new(),
243+
244+
}
245+
}
246+
}
247+
209248
impl Extend<TokenTree> for TokenStream {
210249
fn extend<I: IntoIterator<Item = TokenTree>>(&mut self, streams: I) {
211250
match self {

0 commit comments

Comments
 (0)