diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/ra_assists/src/assists/move_bounds.rs | 9 | ||||
-rw-r--r-- | crates/ra_assists/src/ast_editor.rs | 53 | ||||
-rw-r--r-- | crates/ra_assists/src/lib.rs | 1 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast/edit.rs | 12 |
4 files changed, 16 insertions, 59 deletions
diff --git a/crates/ra_assists/src/assists/move_bounds.rs b/crates/ra_assists/src/assists/move_bounds.rs index 1d27832a3..39ff51233 100644 --- a/crates/ra_assists/src/assists/move_bounds.rs +++ b/crates/ra_assists/src/assists/move_bounds.rs | |||
@@ -1,11 +1,11 @@ | |||
1 | use hir::db::HirDatabase; | 1 | use hir::db::HirDatabase; |
2 | use ra_syntax::{ | 2 | use ra_syntax::{ |
3 | ast::{self, make, AstNode, NameOwner, TypeBoundsOwner}, | 3 | ast::{self, edit, make, AstNode, NameOwner, TypeBoundsOwner}, |
4 | SyntaxElement, | 4 | SyntaxElement, |
5 | SyntaxKind::*, | 5 | SyntaxKind::*, |
6 | }; | 6 | }; |
7 | 7 | ||
8 | use crate::{ast_editor::AstEditor, Assist, AssistCtx, AssistId}; | 8 | use crate::{Assist, AssistCtx, AssistId}; |
9 | 9 | ||
10 | pub(crate) fn move_bounds_to_where_clause(mut ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> { | 10 | pub(crate) fn move_bounds_to_where_clause(mut ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> { |
11 | let type_param_list = ctx.node_at_offset::<ast::TypeParamList>()?; | 11 | let type_param_list = ctx.node_at_offset::<ast::TypeParamList>()?; |
@@ -43,9 +43,8 @@ pub(crate) fn move_bounds_to_where_clause(mut ctx: AssistCtx<impl HirDatabase>) | |||
43 | (type_param, without_bounds) | 43 | (type_param, without_bounds) |
44 | }); | 44 | }); |
45 | 45 | ||
46 | let mut ast_editor = AstEditor::new(type_param_list.clone()); | 46 | let new_type_param_list = edit::replace_descendants(&type_param_list, new_params); |
47 | ast_editor.replace_descendants(new_params); | 47 | edit.replace_ast(type_param_list.clone(), new_type_param_list); |
48 | ast_editor.into_text_edit(edit.text_edit_builder()); | ||
49 | 48 | ||
50 | let where_clause = { | 49 | let where_clause = { |
51 | let predicates = type_param_list.type_params().filter_map(build_predicate); | 50 | let predicates = type_param_list.type_params().filter_map(build_predicate); |
diff --git a/crates/ra_assists/src/ast_editor.rs b/crates/ra_assists/src/ast_editor.rs deleted file mode 100644 index 69abf28a1..000000000 --- a/crates/ra_assists/src/ast_editor.rs +++ /dev/null | |||
@@ -1,53 +0,0 @@ | |||
1 | use std::{iter, ops::RangeInclusive}; | ||
2 | |||
3 | use ra_syntax::{ | ||
4 | algo, | ||
5 | ast::{self, TypeBoundsOwner}, | ||
6 | AstNode, SyntaxElement, | ||
7 | }; | ||
8 | use ra_text_edit::TextEditBuilder; | ||
9 | use rustc_hash::FxHashMap; | ||
10 | |||
11 | pub struct AstEditor<N: AstNode> { | ||
12 | original_ast: N, | ||
13 | ast: N, | ||
14 | } | ||
15 | |||
16 | impl<N: AstNode> AstEditor<N> { | ||
17 | pub fn new(node: N) -> AstEditor<N> | ||
18 | where | ||
19 | N: Clone, | ||
20 | { | ||
21 | AstEditor { original_ast: node.clone(), ast: node } | ||
22 | } | ||
23 | |||
24 | pub fn into_text_edit(self, builder: &mut TextEditBuilder) { | ||
25 | algo::diff(&self.original_ast.syntax(), self.ast().syntax()).into_text_edit(builder) | ||
26 | } | ||
27 | |||
28 | pub fn ast(&self) -> &N { | ||
29 | &self.ast | ||
30 | } | ||
31 | |||
32 | pub fn replace_descendants<T: AstNode>( | ||
33 | &mut self, | ||
34 | replacement_map: impl Iterator<Item = (T, T)>, | ||
35 | ) -> &mut Self { | ||
36 | let map = replacement_map | ||
37 | .map(|(from, to)| (from.syntax().clone().into(), to.syntax().clone().into())) | ||
38 | .collect::<FxHashMap<_, _>>(); | ||
39 | let new_syntax = algo::replace_descendants(self.ast.syntax(), &map); | ||
40 | self.ast = N::cast(new_syntax).unwrap(); | ||
41 | self | ||
42 | } | ||
43 | |||
44 | #[must_use] | ||
45 | fn replace_children( | ||
46 | &self, | ||
47 | to_delete: RangeInclusive<SyntaxElement>, | ||
48 | mut to_insert: impl Iterator<Item = SyntaxElement>, | ||
49 | ) -> N { | ||
50 | let new_syntax = algo::replace_children(self.ast().syntax(), to_delete, &mut to_insert); | ||
51 | N::cast(new_syntax).unwrap() | ||
52 | } | ||
53 | } | ||
diff --git a/crates/ra_assists/src/lib.rs b/crates/ra_assists/src/lib.rs index 3ca3320f7..91b2a1dce 100644 --- a/crates/ra_assists/src/lib.rs +++ b/crates/ra_assists/src/lib.rs | |||
@@ -7,7 +7,6 @@ | |||
7 | 7 | ||
8 | mod assist_ctx; | 8 | mod assist_ctx; |
9 | mod marks; | 9 | mod marks; |
10 | pub mod ast_editor; | ||
11 | 10 | ||
12 | use hir::db::HirDatabase; | 11 | use hir::db::HirDatabase; |
13 | use itertools::Itertools; | 12 | use itertools::Itertools; |
diff --git a/crates/ra_syntax/src/ast/edit.rs b/crates/ra_syntax/src/ast/edit.rs index 9d0fd1383..d0857d88b 100644 --- a/crates/ra_syntax/src/ast/edit.rs +++ b/crates/ra_syntax/src/ast/edit.rs | |||
@@ -4,6 +4,7 @@ | |||
4 | use std::{iter, ops::RangeInclusive}; | 4 | use std::{iter, ops::RangeInclusive}; |
5 | 5 | ||
6 | use arrayvec::ArrayVec; | 6 | use arrayvec::ArrayVec; |
7 | use rustc_hash::FxHashMap; | ||
7 | 8 | ||
8 | use crate::{ | 9 | use crate::{ |
9 | algo, | 10 | algo, |
@@ -216,6 +217,17 @@ fn strip_attrs_and_docs_inner(mut node: SyntaxNode) -> SyntaxNode { | |||
216 | node | 217 | node |
217 | } | 218 | } |
218 | 219 | ||
220 | pub fn replace_descendants<N: AstNode, D: AstNode>( | ||
221 | parent: &N, | ||
222 | replacement_map: impl Iterator<Item = (D, D)>, | ||
223 | ) -> N { | ||
224 | let map = replacement_map | ||
225 | .map(|(from, to)| (from.syntax().clone().into(), to.syntax().clone().into())) | ||
226 | .collect::<FxHashMap<_, _>>(); | ||
227 | let new_syntax = algo::replace_descendants(parent.syntax(), &map); | ||
228 | N::cast(new_syntax).unwrap() | ||
229 | } | ||
230 | |||
219 | // Note this is copy-pasted from fmt. It seems like fmt should be a separate | 231 | // Note this is copy-pasted from fmt. It seems like fmt should be a separate |
220 | // crate, but basic tree building should be this crate. However, tree building | 232 | // crate, but basic tree building should be this crate. However, tree building |
221 | // might want to call into fmt... | 233 | // might want to call into fmt... |