Skip to content

Commit 73123a7

Browse files
committed
internal: remove SyntaxRewriter
1 parent 8737171 commit 73123a7

File tree

3 files changed

+7
-154
lines changed

3 files changed

+7
-154
lines changed

crates/ide_db/src/helpers/merge_imports.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,12 @@ pub fn try_merge_imports(
4242
return None;
4343
}
4444

45+
let lhs = lhs.clone_subtree().clone_for_update();
4546
let lhs_tree = lhs.use_tree()?;
4647
let rhs_tree = rhs.use_tree()?;
4748
let merged = try_merge_trees(&lhs_tree, &rhs_tree, merge_behavior)?;
48-
Some(lhs.with_use_tree(merged).clone_for_update())
49+
ted::replace(lhs_tree.syntax(), merged.syntax());
50+
Some(lhs)
4951
}
5052

5153
pub fn try_merge_trees(

crates/syntax/src/algo.rs

Lines changed: 1 addition & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! FIXME: write short doc here
22
3-
use std::{fmt, hash::BuildHasherDefault, ops::RangeInclusive};
3+
use std::{hash::BuildHasherDefault, ops::RangeInclusive};
44

55
use indexmap::IndexMap;
66
use itertools::Itertools;
@@ -330,110 +330,6 @@ fn _replace_children(
330330
with_children(parent, new_children)
331331
}
332332

333-
#[derive(Debug, PartialEq, Eq, Hash)]
334-
enum InsertPos {
335-
FirstChildOf(SyntaxNode),
336-
After(SyntaxElement),
337-
}
338-
339-
#[derive(Default)]
340-
pub(crate) struct SyntaxRewriter<'a> {
341-
//FIXME: add debug_assertions that all elements are in fact from the same file.
342-
replacements: FxHashMap<SyntaxElement, Replacement>,
343-
insertions: IndexMap<InsertPos, Vec<SyntaxElement>>,
344-
_pd: std::marker::PhantomData<&'a ()>,
345-
}
346-
347-
impl fmt::Debug for SyntaxRewriter<'_> {
348-
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
349-
f.debug_struct("SyntaxRewriter")
350-
.field("replacements", &self.replacements)
351-
.field("insertions", &self.insertions)
352-
.finish()
353-
}
354-
}
355-
356-
impl SyntaxRewriter<'_> {
357-
pub(crate) fn replace<T: Clone + Into<SyntaxElement>>(&mut self, what: &T, with: &T) {
358-
let what = what.clone().into();
359-
let replacement = Replacement::Single(with.clone().into());
360-
self.replacements.insert(what, replacement);
361-
}
362-
363-
pub(crate) fn rewrite(&self, node: &SyntaxNode) -> SyntaxNode {
364-
let _p = profile::span("rewrite");
365-
366-
if self.replacements.is_empty() && self.insertions.is_empty() {
367-
return node.clone();
368-
}
369-
let green = self.rewrite_children(node);
370-
with_green(node, green)
371-
}
372-
373-
pub(crate) fn rewrite_ast<N: AstNode>(self, node: &N) -> N {
374-
N::cast(self.rewrite(node.syntax())).unwrap()
375-
}
376-
377-
fn replacement(&self, element: &SyntaxElement) -> Option<Replacement> {
378-
self.replacements.get(element).cloned()
379-
}
380-
381-
fn insertions(&self, pos: &InsertPos) -> Option<impl Iterator<Item = SyntaxElement> + '_> {
382-
self.insertions.get(pos).map(|insertions| insertions.iter().cloned())
383-
}
384-
385-
fn rewrite_children(&self, node: &SyntaxNode) -> rowan::GreenNode {
386-
let _p = profile::span("rewrite_children");
387-
388-
// FIXME: this could be made much faster.
389-
let mut new_children = Vec::new();
390-
if let Some(elements) = self.insertions(&InsertPos::FirstChildOf(node.clone())) {
391-
new_children.extend(elements.map(element_to_green));
392-
}
393-
for child in node.children_with_tokens() {
394-
self.rewrite_self(&mut new_children, &child);
395-
}
396-
397-
rowan::GreenNode::new(rowan::SyntaxKind(node.kind() as u16), new_children)
398-
}
399-
400-
fn rewrite_self(
401-
&self,
402-
acc: &mut Vec<NodeOrToken<rowan::GreenNode, rowan::GreenToken>>,
403-
element: &SyntaxElement,
404-
) {
405-
let _p = profile::span("rewrite_self");
406-
407-
if let Some(replacement) = self.replacement(&element) {
408-
match replacement {
409-
Replacement::Single(element) => acc.push(element_to_green(element)),
410-
};
411-
} else {
412-
match element {
413-
NodeOrToken::Token(it) => acc.push(NodeOrToken::Token(it.green().to_owned())),
414-
NodeOrToken::Node(it) => {
415-
acc.push(NodeOrToken::Node(self.rewrite_children(it)));
416-
}
417-
}
418-
}
419-
if let Some(elements) = self.insertions(&InsertPos::After(element.clone())) {
420-
acc.extend(elements.map(element_to_green));
421-
}
422-
}
423-
}
424-
425-
fn element_to_green(element: SyntaxElement) -> NodeOrToken<rowan::GreenNode, rowan::GreenToken> {
426-
match element {
427-
NodeOrToken::Node(it) => NodeOrToken::Node(it.green().into_owned()),
428-
NodeOrToken::Token(it) => NodeOrToken::Token(it.green().to_owned()),
429-
}
430-
}
431-
432-
#[derive(Clone, Debug)]
433-
enum Replacement {
434-
Single(SyntaxElement),
435-
}
436-
437333
fn with_children(
438334
parent: &SyntaxNode,
439335
new_children: Vec<NodeOrToken<rowan::GreenNode, rowan::GreenToken>>,

crates/syntax/src/ast/edit.rs

Lines changed: 3 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@
22
//! immutable, all function here return a fresh copy of the tree, instead of
33
//! doing an in-place modification.
44
use std::{
5-
array, fmt, iter,
5+
fmt, iter,
66
ops::{self, RangeInclusive},
77
};
88

99
use arrayvec::ArrayVec;
1010

1111
use crate::{
12-
algo::{self, SyntaxRewriter},
12+
algo,
1313
ast::{
1414
self,
1515
make::{self, tokens},
16-
AstNode, GenericParamsOwner, NameOwner, TypeBoundsOwner,
16+
AstNode, TypeBoundsOwner,
1717
},
1818
ted, AstToken, Direction, InsertPosition, NodeOrToken, SmolStr, SyntaxElement, SyntaxKind,
1919
SyntaxKind::{ATTR, COMMENT, WHITESPACE},
@@ -46,18 +46,6 @@ impl ast::Fn {
4646
to_insert.push(body.syntax().clone().into());
4747
self.replace_children(single_node(old_body_or_semi), to_insert)
4848
}
49-
50-
#[must_use]
51-
pub fn with_generic_param_list(&self, generic_args: ast::GenericParamList) -> ast::Fn {
52-
if let Some(old) = self.generic_param_list() {
53-
return self.replace_descendant(old, generic_args);
54-
}
55-
56-
let anchor = self.name().expect("The function must have a name").syntax().clone();
57-
58-
let to_insert = [generic_args.syntax().clone().into()];
59-
self.insert_children(InsertPosition::After(anchor.into()), array::IntoIter::new(to_insert))
60-
}
6149
}
6250

6351
fn make_multiline<N>(node: N) -> N
@@ -313,33 +301,7 @@ impl ast::PathSegment {
313301
}
314302
}
315303

316-
impl ast::Use {
317-
#[must_use]
318-
pub fn with_use_tree(&self, use_tree: ast::UseTree) -> ast::Use {
319-
if let Some(old) = self.use_tree() {
320-
return self.replace_descendant(old, use_tree);
321-
}
322-
self.clone()
323-
}
324-
}
325-
326304
impl ast::UseTree {
327-
#[must_use]
328-
pub fn with_path(&self, path: ast::Path) -> ast::UseTree {
329-
if let Some(old) = self.path() {
330-
return self.replace_descendant(old, path);
331-
}
332-
self.clone()
333-
}
334-
335-
#[must_use]
336-
pub fn with_use_tree_list(&self, use_tree_list: ast::UseTreeList) -> ast::UseTree {
337-
if let Some(old) = self.use_tree_list() {
338-
return self.replace_descendant(old, use_tree_list);
339-
}
340-
self.clone()
341-
}
342-
343305
/// Splits off the given prefix, making it the path component of the use tree, appending the rest of the path to all UseTreeList items.
344306
#[must_use]
345307
pub fn split_prefix(&self, prefix: &ast::Path) -> ast::UseTree {
@@ -664,13 +626,6 @@ pub trait AstNodeEdit: AstNode + Clone + Sized {
664626
let new_syntax = algo::replace_children(self.syntax(), to_replace, to_insert);
665627
Self::cast(new_syntax).unwrap()
666628
}
667-
668-
#[must_use]
669-
fn replace_descendant<D: AstNode>(&self, old: D, new: D) -> Self {
670-
let mut rewriter = SyntaxRewriter::default();
671-
rewriter.replace(old.syntax(), new.syntax());
672-
rewriter.rewrite_ast(self)
673-
}
674629
fn indent_level(&self) -> IndentLevel {
675630
IndentLevel::from_node(self.syntax())
676631
}

0 commit comments

Comments
 (0)