aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_syntax/src/algo.rs
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2019-11-19 18:14:00 +0000
committerGitHub <[email protected]>2019-11-19 18:14:00 +0000
commit0e61ba3750df7e3e19eda21b6486bf70d6dffc72 (patch)
tree8a20a180f32e1fd9f1f48f1c92a1146c5bd7efcf /crates/ra_syntax/src/algo.rs
parent545c21923e2bc8daee889b26919256bb2ba55282 (diff)
parent83a8430e0a4f4c88e45a017a2212c981b42a4a7a (diff)
Merge #2314
2314: :arrow_up: rowan r=matklad a=matklad Co-authored-by: Aleksey Kladov <[email protected]>
Diffstat (limited to 'crates/ra_syntax/src/algo.rs')
-rw-r--r--crates/ra_syntax/src/algo.rs33
1 files changed, 16 insertions, 17 deletions
diff --git a/crates/ra_syntax/src/algo.rs b/crates/ra_syntax/src/algo.rs
index 7cfea70f9..1c075082a 100644
--- a/crates/ra_syntax/src/algo.rs
+++ b/crates/ra_syntax/src/algo.rs
@@ -134,23 +134,19 @@ pub fn insert_children(
134 to_green_element(element) 134 to_green_element(element)
135 }); 135 });
136 136
137 let old_children = parent.green().children(); 137 let mut old_children = parent.green().children().map(|it| match it {
138 NodeOrToken::Token(it) => NodeOrToken::Token(it.clone()),
139 NodeOrToken::Node(it) => NodeOrToken::Node(it.clone()),
140 });
138 141
139 let new_children = match &position { 142 let new_children = match &position {
140 InsertPosition::First => { 143 InsertPosition::First => to_insert.chain(old_children).collect::<Box<[_]>>(),
141 to_insert.chain(old_children.iter().cloned()).collect::<Box<[_]>>() 144 InsertPosition::Last => old_children.chain(to_insert).collect::<Box<[_]>>(),
142 }
143 InsertPosition::Last => old_children.iter().cloned().chain(to_insert).collect::<Box<[_]>>(),
144 InsertPosition::Before(anchor) | InsertPosition::After(anchor) => { 145 InsertPosition::Before(anchor) | InsertPosition::After(anchor) => {
145 let take_anchor = if let InsertPosition::After(_) = position { 1 } else { 0 }; 146 let take_anchor = if let InsertPosition::After(_) = position { 1 } else { 0 };
146 let split_at = position_of_child(parent, anchor.clone()) + take_anchor; 147 let split_at = position_of_child(parent, anchor.clone()) + take_anchor;
147 let (before, after) = old_children.split_at(split_at); 148 let before = old_children.by_ref().take(split_at).collect::<Vec<_>>();
148 before 149 before.into_iter().chain(to_insert).chain(old_children).collect::<Box<[_]>>()
149 .iter()
150 .cloned()
151 .chain(to_insert)
152 .chain(after.iter().cloned())
153 .collect::<Box<[_]>>()
154 } 150 }
155 }; 151 };
156 152
@@ -168,13 +164,16 @@ pub fn replace_children(
168) -> SyntaxNode { 164) -> SyntaxNode {
169 let start = position_of_child(parent, to_delete.start().clone()); 165 let start = position_of_child(parent, to_delete.start().clone());
170 let end = position_of_child(parent, to_delete.end().clone()); 166 let end = position_of_child(parent, to_delete.end().clone());
171 let old_children = parent.green().children(); 167 let mut old_children = parent.green().children().map(|it| match it {
168 NodeOrToken::Token(it) => NodeOrToken::Token(it.clone()),
169 NodeOrToken::Node(it) => NodeOrToken::Node(it.clone()),
170 });
172 171
173 let new_children = old_children[..start] 172 let before = old_children.by_ref().take(start).collect::<Vec<_>>();
174 .iter() 173 let new_children = before
175 .cloned() 174 .into_iter()
176 .chain(to_insert.map(to_green_element)) 175 .chain(to_insert.map(to_green_element))
177 .chain(old_children[end + 1..].iter().cloned()) 176 .chain(old_children.skip(end + 1 - start))
178 .collect::<Box<[_]>>(); 177 .collect::<Box<[_]>>();
179 with_children(parent, new_children) 178 with_children(parent, new_children)
180} 179}