22
33use std:: str;
44
5+ use itertools:: intersperse;
56use proc_macro2:: { Literal , Punct , Spacing , Span , TokenStream , TokenTree } ;
67use std:: default:: Default ;
78use std:: iter:: FromIterator ;
@@ -161,6 +162,16 @@ fn punct_box<T, P: Default>(x: Vec<Box<T>>) -> Punctuated<T, P> {
161162 Punctuated :: from_iter ( x. into_iter ( ) . map ( |x| * x) )
162163}
163164
165+ fn comma_separated < I , T > ( items : I ) -> TokenStream
166+ where
167+ I : Iterator < Item = T > ,
168+ T : ToTokens + Clone ,
169+ {
170+ let items = items. map ( |items| items. to_token_stream ( ) ) ;
171+ let comma = TokenTree :: Punct ( Punct :: new ( ',' , Spacing :: Alone ) ) . into_token_stream ( ) ;
172+ intersperse ( items, comma) . collect ( )
173+ }
174+
164175pub trait Make < T > {
165176 fn make ( self , mk : & Builder ) -> T ;
166177}
@@ -208,28 +219,6 @@ impl<'a> Make<Path> for &'a str {
208219 }
209220}
210221
211- impl < ' a > Make < Visibility > for & ' a str {
212- fn make ( self , mk_ : & Builder ) -> Visibility {
213- match self {
214- "pub" => Visibility :: Public ( Token ! [ pub ] ( mk_. span ) ) ,
215- "priv" | "" | "inherit" => Visibility :: Inherited ,
216- "pub(crate)" => Visibility :: Restricted ( VisRestricted {
217- pub_token : Token ! [ pub ] ( mk_. span ) ,
218- paren_token : token:: Paren ( mk_. span ) ,
219- in_token : None ,
220- path : Box :: new ( mk ( ) . path ( "crate" ) ) ,
221- } ) ,
222- "pub(super)" => Visibility :: Restricted ( VisRestricted {
223- pub_token : Token ! [ pub ] ( mk_. span ) ,
224- paren_token : token:: Paren ( mk_. span ) ,
225- in_token : None ,
226- path : Box :: new ( mk ( ) . path ( "super" ) ) ,
227- } ) ,
228- _ => panic ! ( "unrecognized string for Visibility: {:?}" , self ) ,
229- }
230- }
231- }
232-
233222impl < ' a > Make < Abi > for & ' a str {
234223 fn make ( self , mk : & Builder ) -> Abi {
235224 Abi {
@@ -252,47 +241,6 @@ impl Make<Extern> for Abi {
252241 }
253242}
254243
255- impl < ' a > Make < Mutability > for & ' a str {
256- fn make ( self , _mk : & Builder ) -> Mutability {
257- match self {
258- "" | "imm" | "immut" | "immutable" => Mutability :: Immutable ,
259- "mut" | "mutable" => Mutability :: Mutable ,
260- _ => panic ! ( "unrecognized string for Mutability: {:?}" , self ) ,
261- }
262- }
263- }
264-
265- impl < ' a > Make < Unsafety > for & ' a str {
266- fn make ( self , _mk : & Builder ) -> Unsafety {
267- match self {
268- "" | "safe" | "normal" => Unsafety :: Normal ,
269- "unsafe" => Unsafety :: Unsafe ,
270- _ => panic ! ( "unrecognized string for Unsafety: {:?}" , self ) ,
271- }
272- }
273- }
274-
275- impl < ' a > Make < Constness > for & ' a str {
276- fn make ( self , _mk : & Builder ) -> Constness {
277- match self {
278- "" | "normal" | "not-const" => Constness :: NotConst ,
279- "const" => Constness :: Const ,
280- _ => panic ! ( "unrecognized string for Constness: {:?}" , self ) ,
281- }
282- }
283- }
284-
285- impl < ' a > Make < UnOp > for & ' a str {
286- fn make ( self , _mk : & Builder ) -> UnOp {
287- match self {
288- "deref" | "*" => UnOp :: Deref ( Default :: default ( ) ) ,
289- "not" | "!" => UnOp :: Not ( Default :: default ( ) ) ,
290- "neg" | "-" => UnOp :: Neg ( Default :: default ( ) ) ,
291- _ => panic ! ( "unrecognized string for UnOp: {:?}" , self ) ,
292- }
293- }
294- }
295-
296244impl < I : Make < Ident > > Make < Lifetime > for I {
297245 fn make ( self , mk : & Builder ) -> Lifetime {
298246 Lifetime {
@@ -330,82 +278,21 @@ impl Make<TokenStream> for Vec<TokenTree> {
330278 }
331279}
332280
333- impl Make < TokenStream > for Vec < String > {
334- fn make ( self , _mk : & Builder ) -> TokenStream {
335- let mut tokens = vec ! [ ] ;
336- let mut first = true ;
337-
338- for s in self {
339- if !first {
340- tokens. push ( TokenTree :: Punct ( Punct :: new ( ',' , Spacing :: Alone ) ) ) ;
341- } else {
342- first = false ;
343- }
344-
345- tokens. push ( TokenTree :: Ident ( Ident :: new ( & s, Span :: call_site ( ) ) ) ) ;
346- }
347-
348- tokens. into_iter ( ) . collect :: < TokenStream > ( )
349- }
350- }
351-
352281impl Make < TokenStream > for Vec < & str > {
353282 fn make ( self , _mk : & Builder ) -> TokenStream {
354- let mut tokens = vec ! [ ] ;
355- let mut first = true ;
356-
357- for s in self {
358- if !first {
359- tokens. push ( TokenTree :: Punct ( Punct :: new ( ',' , Spacing :: Alone ) ) ) ;
360- } else {
361- first = false ;
362- }
363-
364- tokens. push ( TokenTree :: Ident ( Ident :: new ( s, Span :: call_site ( ) ) ) ) ;
365- }
366-
367- tokens. into_iter ( ) . collect :: < TokenStream > ( )
283+ comma_separated ( self . iter ( ) . map ( |& s| Ident :: new ( s, Span :: call_site ( ) ) ) )
368284 }
369285}
370286
371287impl Make < TokenStream > for Vec < u64 > {
372288 fn make ( self , _mk : & Builder ) -> TokenStream {
373- let mut tokens = vec ! [ ] ;
374- let mut first = true ;
375-
376- for s in self {
377- if !first {
378- tokens. push ( TokenTree :: Punct ( Punct :: new ( ',' , Spacing :: Alone ) ) ) ;
379- } else {
380- first = false ;
381- }
382-
383- tokens. push ( TokenTree :: Literal ( Literal :: u64_unsuffixed ( s) ) ) ;
384- }
385-
386- tokens. into_iter ( ) . collect :: < TokenStream > ( )
289+ comma_separated ( self . iter ( ) . map ( |& s| Literal :: u64_unsuffixed ( s) ) )
387290 }
388291}
389292
390293impl Make < TokenStream > for Vec < Meta > {
391294 fn make ( self , _mk : & Builder ) -> TokenStream {
392- let mut tokens = TokenStream :: new ( ) ;
393-
394- let mut first = true ;
395-
396- for meta in self {
397- if !first {
398- let tt = TokenTree :: Punct ( Punct :: new ( ',' , Spacing :: Alone ) ) ;
399-
400- tokens. extend ( vec ! [ tt] ) ;
401- } else {
402- first = false ;
403- }
404-
405- meta. to_tokens ( & mut tokens) ;
406- }
407-
408- tokens
295+ comma_separated ( self . iter ( ) )
409296 }
410297}
411298
@@ -415,12 +302,6 @@ impl Make<PathArguments> for AngleBracketedGenericArguments {
415302 }
416303}
417304
418- impl Make < PathArguments > for ParenthesizedGenericArguments {
419- fn make ( self , _mk : & Builder ) -> PathArguments {
420- PathArguments :: Parenthesized ( self )
421- }
422- }
423-
424305impl Make < GenericArgument > for Box < Type > {
425306 fn make ( self , _mk : & Builder ) -> GenericArgument {
426307 GenericArgument :: Type ( * self )
@@ -661,14 +542,6 @@ impl Builder {
661542 }
662543 }
663544
664- pub fn parenthesized_args ( self , tys : Vec < Box < Type > > ) -> ParenthesizedGenericArguments {
665- ParenthesizedGenericArguments {
666- paren_token : token:: Paren ( self . span ) ,
667- inputs : punct_box ( tys) ,
668- output : ReturnType :: Default ,
669- }
670- }
671-
672545 pub fn angle_bracketed_args < A > ( self , args : Vec < A > ) -> AngleBracketedGenericArguments
673546 where
674547 A : Make < GenericArgument > ,
0 commit comments