diff options
author | Lukas Wirth <[email protected]> | 2021-04-23 17:36:43 +0100 |
---|---|---|
committer | Lukas Wirth <[email protected]> | 2021-04-23 17:36:43 +0100 |
commit | e6e4417bbbcc7e135d1b372e4e278cd3efa2d4b8 (patch) | |
tree | 0f749fe589658f0d2535a1940ec0bd3a9af7225e | |
parent | 20f82191a038b05ead5c4d666fcd75f053a2dc6c (diff) |
Remove SyntaxRewriter::from_fn
-rw-r--r-- | crates/ide_assists/src/ast_transform.rs | 33 | ||||
-rw-r--r-- | crates/ide_assists/src/utils.rs | 3 | ||||
-rw-r--r-- | crates/syntax/src/algo.rs | 19 |
3 files changed, 24 insertions, 31 deletions
diff --git a/crates/ide_assists/src/ast_transform.rs b/crates/ide_assists/src/ast_transform.rs index 4a3ed7783..e5ae718c9 100644 --- a/crates/ide_assists/src/ast_transform.rs +++ b/crates/ide_assists/src/ast_transform.rs | |||
@@ -3,20 +3,27 @@ use hir::{HirDisplay, PathResolution, SemanticsScope}; | |||
3 | use ide_db::helpers::mod_path_to_ast; | 3 | use ide_db::helpers::mod_path_to_ast; |
4 | use rustc_hash::FxHashMap; | 4 | use rustc_hash::FxHashMap; |
5 | use syntax::{ | 5 | use syntax::{ |
6 | algo::SyntaxRewriter, | ||
7 | ast::{self, AstNode}, | 6 | ast::{self, AstNode}, |
8 | SyntaxNode, | 7 | ted, SyntaxNode, |
9 | }; | 8 | }; |
10 | 9 | ||
11 | pub fn apply<'a, N: AstNode>(transformer: &dyn AstTransform<'a>, node: N) -> N { | 10 | pub fn apply<'a, N: AstNode>(transformer: &dyn AstTransform<'a>, node: &N) { |
12 | SyntaxRewriter::from_fn(|element| match element { | 11 | let mut skip_to = None; |
13 | syntax::SyntaxElement::Node(n) => { | 12 | for event in node.syntax().preorder() { |
14 | let replacement = transformer.get_substitution(&n, transformer)?; | 13 | match event { |
15 | Some(replacement.into()) | 14 | syntax::WalkEvent::Enter(node) if skip_to.is_none() => { |
15 | skip_to = transformer.get_substitution(&node, transformer).zip(Some(node)); | ||
16 | } | ||
17 | syntax::WalkEvent::Enter(_) => (), | ||
18 | syntax::WalkEvent::Leave(node) => match &skip_to { | ||
19 | Some((replacement, skip_target)) if *skip_target == node => { | ||
20 | ted::replace(node, replacement.clone_for_update()); | ||
21 | skip_to.take(); | ||
22 | } | ||
23 | _ => (), | ||
24 | }, | ||
16 | } | 25 | } |
17 | _ => None, | 26 | } |
18 | }) | ||
19 | .rewrite_ast(&node) | ||
20 | } | 27 | } |
21 | 28 | ||
22 | /// `AstTransform` helps with applying bulk transformations to syntax nodes. | 29 | /// `AstTransform` helps with applying bulk transformations to syntax nodes. |
@@ -191,11 +198,9 @@ impl<'a> AstTransform<'a> for QualifyPaths<'a> { | |||
191 | let found_path = from.find_use_path(self.source_scope.db.upcast(), def)?; | 198 | let found_path = from.find_use_path(self.source_scope.db.upcast(), def)?; |
192 | let mut path = mod_path_to_ast(&found_path); | 199 | let mut path = mod_path_to_ast(&found_path); |
193 | 200 | ||
194 | let type_args = p | 201 | let type_args = p.segment().and_then(|s| s.generic_arg_list()); |
195 | .segment() | ||
196 | .and_then(|s| s.generic_arg_list()) | ||
197 | .map(|arg_list| apply(recur, arg_list)); | ||
198 | if let Some(type_args) = type_args { | 202 | if let Some(type_args) = type_args { |
203 | apply(recur, &type_args); | ||
199 | let last_segment = path.segment().unwrap(); | 204 | let last_segment = path.segment().unwrap(); |
200 | path = path.with_segment(last_segment.with_generic_args(type_args)) | 205 | path = path.with_segment(last_segment.with_generic_args(type_args)) |
201 | } | 206 | } |
diff --git a/crates/ide_assists/src/utils.rs b/crates/ide_assists/src/utils.rs index d67524937..5a90ad715 100644 --- a/crates/ide_assists/src/utils.rs +++ b/crates/ide_assists/src/utils.rs | |||
@@ -140,7 +140,8 @@ pub fn add_trait_assoc_items_to_impl( | |||
140 | 140 | ||
141 | let items = items | 141 | let items = items |
142 | .into_iter() | 142 | .into_iter() |
143 | .map(|it| ast_transform::apply(&*ast_transform, it)) | 143 | .map(|it| it.clone_for_update()) |
144 | .inspect(|it| ast_transform::apply(&*ast_transform, it)) | ||
144 | .map(|it| match it { | 145 | .map(|it| match it { |
145 | ast::AssocItem::Fn(def) => ast::AssocItem::Fn(add_body(def)), | 146 | ast::AssocItem::Fn(def) => ast::AssocItem::Fn(add_body(def)), |
146 | ast::AssocItem::TypeAlias(def) => ast::AssocItem::TypeAlias(def.remove_bounds()), | 147 | ast::AssocItem::TypeAlias(def) => ast::AssocItem::TypeAlias(def.remove_bounds()), |
diff --git a/crates/syntax/src/algo.rs b/crates/syntax/src/algo.rs index a153a9e1c..c9229c4e0 100644 --- a/crates/syntax/src/algo.rs +++ b/crates/syntax/src/algo.rs | |||
@@ -342,10 +342,10 @@ enum InsertPos { | |||
342 | 342 | ||
343 | #[derive(Default)] | 343 | #[derive(Default)] |
344 | pub struct SyntaxRewriter<'a> { | 344 | pub struct SyntaxRewriter<'a> { |
345 | f: Option<Box<dyn Fn(&SyntaxElement) -> Option<SyntaxElement> + 'a>>, | ||
346 | //FIXME: add debug_assertions that all elements are in fact from the same file. | 345 | //FIXME: add debug_assertions that all elements are in fact from the same file. |
347 | replacements: FxHashMap<SyntaxElement, Replacement>, | 346 | replacements: FxHashMap<SyntaxElement, Replacement>, |
348 | insertions: IndexMap<InsertPos, Vec<SyntaxElement>>, | 347 | insertions: IndexMap<InsertPos, Vec<SyntaxElement>>, |
348 | _pd: std::marker::PhantomData<&'a ()>, | ||
349 | } | 349 | } |
350 | 350 | ||
351 | impl fmt::Debug for SyntaxRewriter<'_> { | 351 | impl fmt::Debug for SyntaxRewriter<'_> { |
@@ -357,14 +357,7 @@ impl fmt::Debug for SyntaxRewriter<'_> { | |||
357 | } | 357 | } |
358 | } | 358 | } |
359 | 359 | ||
360 | impl<'a> SyntaxRewriter<'a> { | 360 | impl SyntaxRewriter<'_> { |
361 | pub fn from_fn(f: impl Fn(&SyntaxElement) -> Option<SyntaxElement> + 'a) -> SyntaxRewriter<'a> { | ||
362 | SyntaxRewriter { | ||
363 | f: Some(Box::new(f)), | ||
364 | replacements: FxHashMap::default(), | ||
365 | insertions: IndexMap::default(), | ||
366 | } | ||
367 | } | ||
368 | pub fn delete<T: Clone + Into<SyntaxElement>>(&mut self, what: &T) { | 361 | pub fn delete<T: Clone + Into<SyntaxElement>>(&mut self, what: &T) { |
369 | let what = what.clone().into(); | 362 | let what = what.clone().into(); |
370 | let replacement = Replacement::Delete; | 363 | let replacement = Replacement::Delete; |
@@ -470,7 +463,7 @@ impl<'a> SyntaxRewriter<'a> { | |||
470 | pub fn rewrite(&self, node: &SyntaxNode) -> SyntaxNode { | 463 | pub fn rewrite(&self, node: &SyntaxNode) -> SyntaxNode { |
471 | let _p = profile::span("rewrite"); | 464 | let _p = profile::span("rewrite"); |
472 | 465 | ||
473 | if self.f.is_none() && self.replacements.is_empty() && self.insertions.is_empty() { | 466 | if self.replacements.is_empty() && self.insertions.is_empty() { |
474 | return node.clone(); | 467 | return node.clone(); |
475 | } | 468 | } |
476 | let green = self.rewrite_children(node); | 469 | let green = self.rewrite_children(node); |
@@ -495,7 +488,6 @@ impl<'a> SyntaxRewriter<'a> { | |||
495 | } | 488 | } |
496 | } | 489 | } |
497 | 490 | ||
498 | assert!(self.f.is_none()); | ||
499 | self.replacements | 491 | self.replacements |
500 | .keys() | 492 | .keys() |
501 | .filter_map(element_to_node_or_parent) | 493 | .filter_map(element_to_node_or_parent) |
@@ -510,10 +502,6 @@ impl<'a> SyntaxRewriter<'a> { | |||
510 | } | 502 | } |
511 | 503 | ||
512 | fn replacement(&self, element: &SyntaxElement) -> Option<Replacement> { | 504 | fn replacement(&self, element: &SyntaxElement) -> Option<Replacement> { |
513 | if let Some(f) = &self.f { | ||
514 | assert!(self.replacements.is_empty()); | ||
515 | return f(element).map(Replacement::Single); | ||
516 | } | ||
517 | self.replacements.get(element).cloned() | 505 | self.replacements.get(element).cloned() |
518 | } | 506 | } |
519 | 507 | ||
@@ -574,7 +562,6 @@ fn element_to_green(element: SyntaxElement) -> NodeOrToken<rowan::GreenNode, row | |||
574 | 562 | ||
575 | impl ops::AddAssign for SyntaxRewriter<'_> { | 563 | impl ops::AddAssign for SyntaxRewriter<'_> { |
576 | fn add_assign(&mut self, rhs: SyntaxRewriter) { | 564 | fn add_assign(&mut self, rhs: SyntaxRewriter) { |
577 | assert!(rhs.f.is_none()); | ||
578 | self.replacements.extend(rhs.replacements); | 565 | self.replacements.extend(rhs.replacements); |
579 | for (pos, insertions) in rhs.insertions.into_iter() { | 566 | for (pos, insertions) in rhs.insertions.into_iter() { |
580 | match self.insertions.entry(pos) { | 567 | match self.insertions.entry(pos) { |