@@ -4,7 +4,7 @@ use itertools::Itertools;
44use crate :: {
55 ast:: { self , make, HasName , HasTypeBounds } ,
66 syntax_editor:: SyntaxMappingBuilder ,
7- AstNode , SyntaxKind , SyntaxToken ,
7+ AstNode , NodeOrToken , SyntaxKind , SyntaxNode , SyntaxToken ,
88} ;
99
1010use super :: SyntaxFactory ;
@@ -169,6 +169,32 @@ impl SyntaxFactory {
169169 ast
170170 }
171171
172+ pub fn token_tree (
173+ & self ,
174+ delimiter : SyntaxKind ,
175+ tt : Vec < NodeOrToken < ast:: TokenTree , SyntaxToken > > ,
176+ ) -> ast:: TokenTree {
177+ let tt: Vec < _ > = tt. into_iter ( ) . collect ( ) ;
178+ let input: Vec < _ > = tt. iter ( ) . cloned ( ) . filter_map ( only_nodes) . collect ( ) ;
179+
180+ let ast = make:: token_tree ( delimiter, tt) . clone_for_update ( ) ;
181+
182+ if let Some ( mut mapping) = self . mappings ( ) {
183+ let mut builder = SyntaxMappingBuilder :: new ( ast. syntax ( ) . clone ( ) ) ;
184+ builder. map_children (
185+ input. into_iter ( ) ,
186+ ast. token_trees_and_tokens ( ) . filter_map ( only_nodes) ,
187+ ) ;
188+ builder. finish ( & mut mapping) ;
189+ }
190+
191+ return ast;
192+
193+ fn only_nodes ( element : NodeOrToken < ast:: TokenTree , SyntaxToken > ) -> Option < SyntaxNode > {
194+ element. as_node ( ) . map ( |it| it. syntax ( ) . clone ( ) )
195+ }
196+ }
197+
172198 pub fn token ( & self , kind : SyntaxKind ) -> SyntaxToken {
173199 make:: token ( kind)
174200 }
0 commit comments