aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_syntax/src/algo.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_syntax/src/algo.rs')
-rw-r--r--crates/ra_syntax/src/algo.rs31
1 files changed, 28 insertions, 3 deletions
diff --git a/crates/ra_syntax/src/algo.rs b/crates/ra_syntax/src/algo.rs
index ebf59288a..b87c7084e 100644
--- a/crates/ra_syntax/src/algo.rs
+++ b/crates/ra_syntax/src/algo.rs
@@ -144,6 +144,15 @@ pub fn diff(from: &SyntaxNode, to: &SyntaxNode) -> TreeDiff {
144pub fn insert_children( 144pub fn insert_children(
145 parent: &SyntaxNode, 145 parent: &SyntaxNode,
146 position: InsertPosition<SyntaxElement>, 146 position: InsertPosition<SyntaxElement>,
147 to_insert: impl IntoIterator<Item = SyntaxElement>,
148) -> SyntaxNode {
149 let mut to_insert = to_insert.into_iter();
150 _insert_children(parent, position, &mut to_insert)
151}
152
153fn _insert_children(
154 parent: &SyntaxNode,
155 position: InsertPosition<SyntaxElement>,
147 to_insert: &mut dyn Iterator<Item = SyntaxElement>, 156 to_insert: &mut dyn Iterator<Item = SyntaxElement>,
148) -> SyntaxNode { 157) -> SyntaxNode {
149 let mut delta = TextUnit::default(); 158 let mut delta = TextUnit::default();
@@ -178,6 +187,15 @@ pub fn insert_children(
178pub fn replace_children( 187pub fn replace_children(
179 parent: &SyntaxNode, 188 parent: &SyntaxNode,
180 to_delete: RangeInclusive<SyntaxElement>, 189 to_delete: RangeInclusive<SyntaxElement>,
190 to_insert: impl IntoIterator<Item = SyntaxElement>,
191) -> SyntaxNode {
192 let mut to_insert = to_insert.into_iter();
193 _replace_children(parent, to_delete, &mut to_insert)
194}
195
196fn _replace_children(
197 parent: &SyntaxNode,
198 to_delete: RangeInclusive<SyntaxElement>,
181 to_insert: &mut dyn Iterator<Item = SyntaxElement>, 199 to_insert: &mut dyn Iterator<Item = SyntaxElement>,
182) -> SyntaxNode { 200) -> SyntaxNode {
183 let start = position_of_child(parent, to_delete.start().clone()); 201 let start = position_of_child(parent, to_delete.start().clone());
@@ -202,14 +220,21 @@ pub fn replace_children(
202/// to create a type-safe abstraction on top of it instead. 220/// to create a type-safe abstraction on top of it instead.
203pub fn replace_descendants( 221pub fn replace_descendants(
204 parent: &SyntaxNode, 222 parent: &SyntaxNode,
205 map: &impl Fn(&SyntaxElement) -> Option<SyntaxElement>, 223 map: impl Fn(&SyntaxElement) -> Option<SyntaxElement>,
224) -> SyntaxNode {
225 _replace_descendants(parent, &map)
226}
227
228fn _replace_descendants(
229 parent: &SyntaxNode,
230 map: &dyn Fn(&SyntaxElement) -> Option<SyntaxElement>,
206) -> SyntaxNode { 231) -> SyntaxNode {
207 // FIXME: this could be made much faster. 232 // FIXME: this could be made much faster.
208 let new_children = parent.children_with_tokens().map(|it| go(map, it)).collect::<Vec<_>>(); 233 let new_children = parent.children_with_tokens().map(|it| go(map, it)).collect::<Vec<_>>();
209 return with_children(parent, new_children); 234 return with_children(parent, new_children);
210 235
211 fn go( 236 fn go(
212 map: &impl Fn(&SyntaxElement) -> Option<SyntaxElement>, 237 map: &dyn Fn(&SyntaxElement) -> Option<SyntaxElement>,
213 element: SyntaxElement, 238 element: SyntaxElement,
214 ) -> NodeOrToken<rowan::GreenNode, rowan::GreenToken> { 239 ) -> NodeOrToken<rowan::GreenNode, rowan::GreenToken> {
215 if let Some(replacement) = map(&element) { 240 if let Some(replacement) = map(&element) {
@@ -221,7 +246,7 @@ pub fn replace_descendants(
221 match element { 246 match element {
222 NodeOrToken::Token(it) => NodeOrToken::Token(it.green().clone()), 247 NodeOrToken::Token(it) => NodeOrToken::Token(it.green().clone()),
223 NodeOrToken::Node(it) => { 248 NodeOrToken::Node(it) => {
224 NodeOrToken::Node(replace_descendants(&it, map).green().clone()) 249 NodeOrToken::Node(_replace_descendants(&it, map).green().clone())
225 } 250 }
226 } 251 }
227 } 252 }