1
1
//! Wrappers over [`make`] constructors
2
- use itertools:: Itertools ;
3
-
4
2
use crate :: {
5
3
ast:: { self , make, HasGenericParams , HasName , HasTypeBounds , HasVisibility } ,
6
4
syntax_editor:: SyntaxMappingBuilder ,
@@ -65,8 +63,7 @@ impl SyntaxFactory {
65
63
stmts : impl IntoIterator < Item = ast:: Stmt > ,
66
64
tail_expr : Option < ast:: Expr > ,
67
65
) -> ast:: BlockExpr {
68
- let stmts = stmts. into_iter ( ) . collect_vec ( ) ;
69
- let mut input = stmts. iter ( ) . map ( |it| it. syntax ( ) . clone ( ) ) . collect_vec ( ) ;
66
+ let ( stmts, mut input) = iterator_input ( stmts) ;
70
67
71
68
let ast = make:: block_expr ( stmts, tail_expr. clone ( ) ) . clone_for_update ( ) ;
72
69
@@ -257,14 +254,15 @@ impl SyntaxFactory {
257
254
258
255
pub fn turbofish_generic_arg_list (
259
256
& self ,
260
- args : impl IntoIterator < Item = ast:: GenericArg > + Clone ,
257
+ generic_args : impl IntoIterator < Item = ast:: GenericArg > ,
261
258
) -> ast:: GenericArgList {
262
- let ast = make:: turbofish_generic_arg_list ( args. clone ( ) ) . clone_for_update ( ) ;
259
+ let ( generic_args, input) = iterator_input ( generic_args) ;
260
+ let ast = make:: turbofish_generic_arg_list ( generic_args. clone ( ) ) . clone_for_update ( ) ;
263
261
264
262
if let Some ( mut mapping) = self . mappings ( ) {
265
263
let mut builder = SyntaxMappingBuilder :: new ( ast. syntax ( ) . clone ( ) ) ;
266
264
builder. map_children (
267
- args . into_iter ( ) . map ( |arg| arg . syntax ( ) . clone ( ) ) ,
265
+ input . into_iter ( ) ,
268
266
ast. generic_args ( ) . map ( |arg| arg. syntax ( ) . clone ( ) ) ,
269
267
) ;
270
268
builder. finish ( & mut mapping) ;
@@ -277,8 +275,7 @@ impl SyntaxFactory {
277
275
& self ,
278
276
fields : impl IntoIterator < Item = ast:: RecordField > ,
279
277
) -> ast:: RecordFieldList {
280
- let fields: Vec < ast:: RecordField > = fields. into_iter ( ) . collect ( ) ;
281
- let input: Vec < _ > = fields. iter ( ) . map ( |it| it. syntax ( ) . clone ( ) ) . collect ( ) ;
278
+ let ( fields, input) = iterator_input ( fields) ;
282
279
let ast = make:: record_field_list ( fields) . clone_for_update ( ) ;
283
280
284
281
if let Some ( mut mapping) = self . mappings ( ) {
@@ -323,8 +320,7 @@ impl SyntaxFactory {
323
320
& self ,
324
321
fields : impl IntoIterator < Item = ast:: TupleField > ,
325
322
) -> ast:: TupleFieldList {
326
- let fields: Vec < ast:: TupleField > = fields. into_iter ( ) . collect ( ) ;
327
- let input: Vec < _ > = fields. iter ( ) . map ( |it| it. syntax ( ) . clone ( ) ) . collect ( ) ;
323
+ let ( fields, input) = iterator_input ( fields) ;
328
324
let ast = make:: tuple_field_list ( fields) . clone_for_update ( ) ;
329
325
330
326
if let Some ( mut mapping) = self . mappings ( ) {
@@ -419,8 +415,7 @@ impl SyntaxFactory {
419
415
& self ,
420
416
variants : impl IntoIterator < Item = ast:: Variant > ,
421
417
) -> ast:: VariantList {
422
- let variants: Vec < ast:: Variant > = variants. into_iter ( ) . collect ( ) ;
423
- let input: Vec < _ > = variants. iter ( ) . map ( |it| it. syntax ( ) . clone ( ) ) . collect ( ) ;
418
+ let ( variants, input) = iterator_input ( variants) ;
424
419
let ast = make:: variant_list ( variants) . clone_for_update ( ) ;
425
420
426
421
if let Some ( mut mapping) = self . mappings ( ) {
@@ -481,7 +476,7 @@ impl SyntaxFactory {
481
476
pub fn token_tree (
482
477
& self ,
483
478
delimiter : SyntaxKind ,
484
- tt : Vec < NodeOrToken < ast:: TokenTree , SyntaxToken > > ,
479
+ tt : impl IntoIterator < Item = NodeOrToken < ast:: TokenTree , SyntaxToken > > ,
485
480
) -> ast:: TokenTree {
486
481
let tt: Vec < _ > = tt. into_iter ( ) . collect ( ) ;
487
482
let input: Vec < _ > = tt. iter ( ) . cloned ( ) . filter_map ( only_nodes) . collect ( ) ;
@@ -512,3 +507,13 @@ impl SyntaxFactory {
512
507
make:: tokens:: whitespace ( text)
513
508
}
514
509
}
510
+
511
+ fn iterator_input < N : AstNode > ( input : impl IntoIterator < Item = N > ) -> ( Vec < N > , Vec < SyntaxNode > ) {
512
+ input
513
+ . into_iter ( )
514
+ . map ( |it| {
515
+ let syntax = it. syntax ( ) . clone ( ) ;
516
+ ( it, syntax)
517
+ } )
518
+ . collect ( )
519
+ }
0 commit comments