diff options
Diffstat (limited to 'crates/ra_syntax/src/algo.rs')
-rw-r--r-- | crates/ra_syntax/src/algo.rs | 31 |
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 { | |||
144 | pub fn insert_children( | 144 | pub 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 | |||
153 | fn _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( | |||
178 | pub fn replace_children( | 187 | pub 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 | |||
196 | fn _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. |
203 | pub fn replace_descendants( | 221 | pub 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 | |||
228 | fn _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 | } |