aboutsummaryrefslogtreecommitdiff
path: root/crates/libsyntax2/src/yellow
diff options
context:
space:
mode:
Diffstat (limited to 'crates/libsyntax2/src/yellow')
-rw-r--r--crates/libsyntax2/src/yellow/syntax.rs23
1 files changed, 22 insertions, 1 deletions
diff --git a/crates/libsyntax2/src/yellow/syntax.rs b/crates/libsyntax2/src/yellow/syntax.rs
index 8f1b1d79a..0045598d4 100644
--- a/crates/libsyntax2/src/yellow/syntax.rs
+++ b/crates/libsyntax2/src/yellow/syntax.rs
@@ -3,7 +3,7 @@ use std::{fmt, sync::Arc};
3use smol_str::SmolStr; 3use smol_str::SmolStr;
4 4
5use { 5use {
6 yellow::{RedNode, TreeRoot, SyntaxRoot, RedPtr, RefRoot, OwnedRoot}, 6 yellow::{GreenNode, RedNode, TreeRoot, SyntaxRoot, RedPtr, RefRoot, OwnedRoot},
7 SyntaxKind::{self, *}, 7 SyntaxKind::{self, *},
8 TextRange, TextUnit, 8 TextRange, TextUnit,
9}; 9};
@@ -141,6 +141,27 @@ impl<R: TreeRoot> SyntaxNode<R> {
141 self.red().green().leaf_text() 141 self.red().green().leaf_text()
142 } 142 }
143 143
144 pub(crate) fn replace_with(&self, green: GreenNode) -> GreenNode {
145 assert_eq!(self.kind(), green.kind());
146 match self.parent() {
147 None => green,
148 Some(parent) => {
149 let children: Vec<_> = parent.children().map(|child| {
150 if child == *self {
151 green.clone()
152 } else {
153 child.red().green().clone()
154 }
155 }).collect();
156 let new_parent = GreenNode::new_branch(
157 parent.kind(),
158 children.into_boxed_slice(),
159 );
160 parent.replace_with(new_parent)
161 },
162 }
163 }
164
144 fn red(&self) -> &RedNode { 165 fn red(&self) -> &RedNode {
145 unsafe { self.red.get(&self.root) } 166 unsafe { self.red.get(&self.root) }
146 } 167 }