Skip to content

Commit 806ffb7

Browse files
committed
minor: Add token_tree constructor to SyntaxFactory
1 parent 418ad88 commit 806ffb7

File tree

1 file changed

+27
-1
lines changed
  • src/tools/rust-analyzer/crates/syntax/src/ast/syntax_factory

1 file changed

+27
-1
lines changed

src/tools/rust-analyzer/crates/syntax/src/ast/syntax_factory/constructors.rs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use itertools::Itertools;
44
use crate::{
55
ast::{self, make, HasName, HasTypeBounds},
66
syntax_editor::SyntaxMappingBuilder,
7-
AstNode, SyntaxKind, SyntaxToken,
7+
AstNode, NodeOrToken, SyntaxKind, SyntaxNode, SyntaxToken,
88
};
99

1010
use 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

Comments
 (0)