11use crate :: parse:: { self , Cursor } ;
2+ use crate :: rcvec:: { RcVec , RcVecBuilder , RcVecIntoIter , RcVecMut } ;
23use crate :: { Delimiter , Spacing , TokenTree } ;
34#[ cfg( span_locations) ]
45use std:: cell:: RefCell ;
56#[ cfg( span_locations) ]
67use std:: cmp;
78use std:: fmt:: { self , Debug , Display , Write } ;
89use std:: iter:: FromIterator ;
9- use std:: mem;
1010use std:: ops:: RangeBounds ;
1111#[ cfg( procmacro2_semver_exempt) ]
1212use std:: path:: Path ;
1313use std:: path:: PathBuf ;
14- use std:: rc:: Rc ;
1514use std:: str:: FromStr ;
16- use std:: vec;
1715
1816/// Force use of proc-macro2's fallback implementation of the API for now, even
1917/// if the compiler's implementation is available.
@@ -31,7 +29,7 @@ pub fn unforce() {
3129
3230#[ derive( Clone ) ]
3331pub ( crate ) struct TokenStream {
34- inner : Rc < Vec < TokenTree > > ,
32+ inner : RcVec < TokenTree > ,
3533}
3634
3735#[ derive( Debug ) ]
@@ -54,20 +52,20 @@ impl LexError {
5452impl TokenStream {
5553 pub fn new ( ) -> Self {
5654 TokenStream {
57- inner : Rc :: new ( Vec :: new ( ) ) ,
55+ inner : RcVec :: new ( ) ,
5856 }
5957 }
6058
6159 pub fn is_empty ( & self ) -> bool {
6260 self . inner . len ( ) == 0
6361 }
6462
65- fn take_inner ( & mut self ) -> Vec < TokenTree > {
66- mem :: replace ( Rc :: make_mut ( & mut self . inner ) , Vec :: new ( ) )
63+ fn take_inner ( & mut self ) -> RcVecBuilder < TokenTree > {
64+ self . inner . make_mut ( ) . take ( )
6765 }
6866}
6967
70- fn push_token_from_proc_macro ( vec : & mut Vec < TokenTree > , token : TokenTree ) {
68+ fn push_token_from_proc_macro ( mut vec : RcVecMut < TokenTree > , token : TokenTree ) {
7169 // https://github.com/dtolnay/proc-macro2/issues/235
7270 match token {
7371 #[ cfg( not( no_bind_by_move_pattern_guard) ) ]
@@ -98,7 +96,7 @@ fn push_token_from_proc_macro(vec: &mut Vec<TokenTree>, token: TokenTree) {
9896 }
9997
10098 #[ cold]
101- fn push_negative_literal ( vec : & mut Vec < TokenTree > , mut literal : Literal ) {
99+ fn push_negative_literal ( mut vec : RcVecMut < TokenTree > , mut literal : Literal ) {
102100 literal. repr . remove ( 0 ) ;
103101 let mut punct = crate :: Punct :: new ( '-' , Spacing :: Alone ) ;
104102 punct. set_span ( crate :: Span :: _new_stable ( literal. span ) ) ;
@@ -110,7 +108,7 @@ fn push_token_from_proc_macro(vec: &mut Vec<TokenTree>, token: TokenTree) {
110108// Nonrecursive to prevent stack overflow.
111109impl Drop for TokenStream {
112110 fn drop ( & mut self ) {
113- let inner = match Rc :: get_mut ( & mut self . inner ) {
111+ let mut inner = match self . inner . get_mut ( ) {
114112 Some ( inner) => inner,
115113 None => return ,
116114 } ;
@@ -131,17 +129,19 @@ impl Drop for TokenStream {
131129}
132130
133131pub ( crate ) struct TokenStreamBuilder {
134- inner : Vec < TokenTree > ,
132+ inner : RcVecBuilder < TokenTree > ,
135133}
136134
137135impl TokenStreamBuilder {
138136 pub fn new ( ) -> Self {
139- TokenStreamBuilder { inner : Vec :: new ( ) }
137+ TokenStreamBuilder {
138+ inner : RcVecBuilder :: new ( ) ,
139+ }
140140 }
141141
142142 pub fn with_capacity ( cap : usize ) -> Self {
143143 TokenStreamBuilder {
144- inner : Vec :: with_capacity ( cap) ,
144+ inner : RcVecBuilder :: with_capacity ( cap) ,
145145 }
146146 }
147147
@@ -151,7 +151,7 @@ impl TokenStreamBuilder {
151151
152152 pub fn build ( self ) -> TokenStream {
153153 TokenStream {
154- inner : Rc :: new ( self . inner ) ,
154+ inner : self . inner . build ( ) ,
155155 }
156156 }
157157}
@@ -244,9 +244,11 @@ impl From<TokenStream> for proc_macro::TokenStream {
244244
245245impl From < TokenTree > for TokenStream {
246246 fn from ( tree : TokenTree ) -> TokenStream {
247- let mut stream = TokenStreamBuilder :: new ( ) ;
248- push_token_from_proc_macro ( & mut stream. inner , tree) ;
249- stream. build ( )
247+ let mut stream = RcVecBuilder :: new ( ) ;
248+ push_token_from_proc_macro ( stream. as_mut ( ) , tree) ;
249+ TokenStream {
250+ inner : stream. build ( ) ,
251+ }
250252 }
251253}
252254
@@ -260,32 +262,32 @@ impl FromIterator<TokenTree> for TokenStream {
260262
261263impl FromIterator < TokenStream > for TokenStream {
262264 fn from_iter < I : IntoIterator < Item = TokenStream > > ( streams : I ) -> Self {
263- let mut v = Vec :: new ( ) ;
265+ let mut v = RcVecBuilder :: new ( ) ;
264266
265267 for mut stream in streams {
266268 v. extend ( stream. take_inner ( ) ) ;
267269 }
268270
269- TokenStream { inner : Rc :: new ( v ) }
271+ TokenStream { inner : v . build ( ) }
270272 }
271273}
272274
273275impl Extend < TokenTree > for TokenStream {
274276 fn extend < I : IntoIterator < Item = TokenTree > > ( & mut self , tokens : I ) {
275- let vec = Rc :: make_mut ( & mut self . inner ) ;
277+ let mut vec = self . inner . make_mut ( ) ;
276278 tokens
277279 . into_iter ( )
278- . for_each ( |token| push_token_from_proc_macro ( vec, token) ) ;
280+ . for_each ( |token| push_token_from_proc_macro ( vec. as_mut ( ) , token) ) ;
279281 }
280282}
281283
282284impl Extend < TokenStream > for TokenStream {
283285 fn extend < I : IntoIterator < Item = TokenStream > > ( & mut self , streams : I ) {
284- Rc :: make_mut ( & mut self . inner ) . extend ( streams. into_iter ( ) . flatten ( ) ) ;
286+ self . inner . make_mut ( ) . extend ( streams. into_iter ( ) . flatten ( ) ) ;
285287 }
286288}
287289
288- pub ( crate ) type TokenTreeIter = vec :: IntoIter < TokenTree > ;
290+ pub ( crate ) type TokenTreeIter = RcVecIntoIter < TokenTree > ;
289291
290292impl IntoIterator for TokenStream {
291293 type Item = TokenTree ;
0 commit comments