diff options
Diffstat (limited to 'crates/ra_syntax/src')
-rw-r--r-- | crates/ra_syntax/src/algo.rs | 33 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast/extensions.rs | 2 |
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 | ||
34 | fn text_of_first_token(node: &SyntaxNode) -> &SmolStr { | 34 | fn 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 | ||
38 | impl ast::Attr { | 38 | impl ast::Attr { |