about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGiga Bowser <45986823+Giga-Bowser@users.noreply.github.com>2024-11-23 12:41:48 -0500
committerGiga Bowser <45986823+Giga-Bowser@users.noreply.github.com>2024-12-06 10:03:09 -0500
commit806ffb7dbaa1067b6a62a98c3b239ba29fe4e9a4 (patch)
treed7fa9a3ce97b44e290b62d8706f3836a404a6eea
parent418ad88045b0a7862508293662eb30f5aeff4b75 (diff)
downloadrust-806ffb7dbaa1067b6a62a98c3b239ba29fe4e9a4.tar.gz
rust-806ffb7dbaa1067b6a62a98c3b239ba29fe4e9a4.zip
minor: Add `token_tree` constructor to `SyntaxFactory`
-rw-r--r--src/tools/rust-analyzer/crates/syntax/src/ast/syntax_factory/constructors.rs28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/tools/rust-analyzer/crates/syntax/src/ast/syntax_factory/constructors.rs b/src/tools/rust-analyzer/crates/syntax/src/ast/syntax_factory/constructors.rs
index 944724ff05c..54f17bd721d 100644
--- a/src/tools/rust-analyzer/crates/syntax/src/ast/syntax_factory/constructors.rs
+++ b/src/tools/rust-analyzer/crates/syntax/src/ast/syntax_factory/constructors.rs
@@ -4,7 +4,7 @@ use itertools::Itertools;
 use crate::{
     ast::{self, make, HasName, HasTypeBounds},
     syntax_editor::SyntaxMappingBuilder,
-    AstNode, SyntaxKind, SyntaxToken,
+    AstNode, NodeOrToken, SyntaxKind, SyntaxNode, SyntaxToken,
 };
 
 use super::SyntaxFactory;
@@ -169,6 +169,32 @@ impl SyntaxFactory {
         ast
     }
 
+    pub fn token_tree(
+        &self,
+        delimiter: SyntaxKind,
+        tt: Vec<NodeOrToken<ast::TokenTree, SyntaxToken>>,
+    ) -> ast::TokenTree {
+        let tt: Vec<_> = tt.into_iter().collect();
+        let input: Vec<_> = tt.iter().cloned().filter_map(only_nodes).collect();
+
+        let ast = make::token_tree(delimiter, tt).clone_for_update();
+
+        if let Some(mut mapping) = self.mappings() {
+            let mut builder = SyntaxMappingBuilder::new(ast.syntax().clone());
+            builder.map_children(
+                input.into_iter(),
+                ast.token_trees_and_tokens().filter_map(only_nodes),
+            );
+            builder.finish(&mut mapping);
+        }
+
+        return ast;
+
+        fn only_nodes(element: NodeOrToken<ast::TokenTree, SyntaxToken>) -> Option<SyntaxNode> {
+            element.as_node().map(|it| it.syntax().clone())
+        }
+    }
+
     pub fn token(&self, kind: SyntaxKind) -> SyntaxToken {
         make::token(kind)
     }