@@ -4,7 +4,7 @@ use itertools::Itertools;
4
4
use crate :: {
5
5
ast:: { self , make, HasName , HasTypeBounds } ,
6
6
syntax_editor:: SyntaxMappingBuilder ,
7
- AstNode , SyntaxKind , SyntaxToken ,
7
+ AstNode , NodeOrToken , SyntaxKind , SyntaxNode , SyntaxToken ,
8
8
} ;
9
9
10
10
use super :: SyntaxFactory ;
@@ -169,6 +169,32 @@ impl SyntaxFactory {
169
169
ast
170
170
}
171
171
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
+
172
198
pub fn token ( & self , kind : SyntaxKind ) -> SyntaxToken {
173
199
make:: token ( kind)
174
200
}
0 commit comments