about summary refs log tree commit diff
path: root/src/libproc_macro
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2018-08-16 15:44:30 +0000
committerbors <bors@rust-lang.org>2018-08-16 15:44:30 +0000
commitb5590423e6ceb048dd7d792382e960d66b7615d2 (patch)
tree378f5a5992fb8915a27e61d594a6497df71d6e5b /src/libproc_macro
parent50503497492e9bab8bc8c5ad3fe403a3a80276d3 (diff)
parent69b9c23b3858dc87ceb6629b7640d5f579b8ed79 (diff)
downloadrust-b5590423e6ceb048dd7d792382e960d66b7615d2.tar.gz
rust-b5590423e6ceb048dd7d792382e960d66b7615d2.zip
Auto merge of #53304 - dtolnay:extend, r=dtolnay
TokenStream::extend

Two new insta-stable impls in libproc_macro:

```rust
impl Extend<TokenTree> for TokenStream
impl Extend<TokenStream> for TokenStream
```

`proc_macro::TokenStream` already implements `FromIterator<TokenTree>` and `FromIterator<TokenStream>` so I elected to support the same input types for `Extend`.

**This commit reduces compile time of Serde derives by 60% (takes less than half as long to compile)** as measured by building our test suite:

```console
$ git clone https://github.com/serde-rs/serde
$ cd serde/test_suite
$ cargo check --tests --features proc-macro2/nightly
$ rm -f ../target/debug/deps/libtest_*.rmeta
$ time cargo check --tests --features proc-macro2/nightly
Before: 20.8 seconds
After: 8.6 seconds
```

r? @alexcrichton
Diffstat (limited to 'src/libproc_macro')
-rw-r--r--src/libproc_macro/lib.rs14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/libproc_macro/lib.rs b/src/libproc_macro/lib.rs
index fec90008c67..66afe36e7cb 100644
--- a/src/libproc_macro/lib.rs
+++ b/src/libproc_macro/lib.rs
@@ -180,6 +180,20 @@ impl iter::FromIterator<TokenStream> for TokenStream {
     }
 }
 
+#[stable(feature = "token_stream_extend", since = "1.30.0")]
+impl Extend<TokenTree> for TokenStream {
+    fn extend<I: IntoIterator<Item = TokenTree>>(&mut self, trees: I) {
+        self.extend(trees.into_iter().map(TokenStream::from));
+    }
+}
+
+#[stable(feature = "token_stream_extend", since = "1.30.0")]
+impl Extend<TokenStream> for TokenStream {
+    fn extend<I: IntoIterator<Item = TokenStream>>(&mut self, streams: I) {
+        self.0.extend(streams.into_iter().map(|stream| stream.0));
+    }
+}
+
 /// Public implementation details for the `TokenStream` type, such as iterators.
 #[stable(feature = "proc_macro_lib2", since = "1.29.0")]
 pub mod token_stream {