aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_syntax/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_syntax/src')
-rw-r--r--crates/ra_syntax/src/algo.rs33
-rw-r--r--crates/ra_syntax/src/ast/extensions.rs2
2 files changed, 17 insertions, 18 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}
diff --git a/crates/ra_syntax/src/ast/extensions.rs b/crates/ra_syntax/src/ast/extensions.rs
index 761b2435c..4851dacb2 100644
--- a/crates/ra_syntax/src/ast/extensions.rs
+++ b/crates/ra_syntax/src/ast/extensions.rs
@@ -32,7 +32,7 @@ impl ast::NameRef {
32} 32}
33 33
34fn text_of_first_token(node: &SyntaxNode) -> &SmolStr { 34fn text_of_first_token(node: &SyntaxNode) -> &SmolStr {
35 node.green().children().first().and_then(|it| it.as_token()).unwrap().text() 35 node.green().children().next().and_then(|it| it.into_token()).unwrap().text()
36} 36}
37 37
38impl ast::Attr { 38impl ast::Attr {