Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/syntax/src/syntax_editor/edits.rs')
-rw-r--r--crates/syntax/src/syntax_editor/edits.rs50
1 files changed, 49 insertions, 1 deletions
diff --git a/crates/syntax/src/syntax_editor/edits.rs b/crates/syntax/src/syntax_editor/edits.rs
index 350cb3e254..d66ea8aa28 100644
--- a/crates/syntax/src/syntax_editor/edits.rs
+++ b/crates/syntax/src/syntax_editor/edits.rs
@@ -1,7 +1,8 @@
//! Structural editing for ast using `SyntaxEditor`
use crate::{
- Direction, SyntaxElement, SyntaxKind, SyntaxNode, SyntaxToken, T,
+ AstToken, Direction, SyntaxElement, SyntaxKind, SyntaxNode, SyntaxToken, T,
+ algo::neighbor,
ast::{
self, AstNode, Fn, GenericParam, HasGenericParams, HasName, edit::IndentLevel, make,
syntax_factory::SyntaxFactory,
@@ -143,6 +144,53 @@ fn normalize_ws_between_braces(editor: &mut SyntaxEditor, node: &SyntaxNode) ->
Some(())
}
+pub trait Removable: AstNode {
+ fn remove(&self, editor: &mut SyntaxEditor);
+}
+
+impl Removable for ast::Use {
+ fn remove(&self, editor: &mut SyntaxEditor) {
+ let make = SyntaxFactory::without_mappings();
+
+ let next_ws = self
+ .syntax()
+ .next_sibling_or_token()
+ .and_then(|it| it.into_token())
+ .and_then(ast::Whitespace::cast);
+ if let Some(next_ws) = next_ws {
+ let ws_text = next_ws.syntax().text();
+ if let Some(rest) = ws_text.strip_prefix('\n') {
+ if rest.is_empty() {
+ editor.delete(next_ws.syntax());
+ } else {
+ editor.replace(next_ws.syntax(), make.whitespace(rest));
+ }
+ }
+ }
+
+ editor.delete(self.syntax());
+ }
+}
+
+impl Removable for ast::UseTree {
+ fn remove(&self, editor: &mut SyntaxEditor) {
+ for dir in [Direction::Next, Direction::Prev] {
+ if let Some(next_use_tree) = neighbor(self, dir) {
+ let separators = self
+ .syntax()
+ .siblings_with_tokens(dir)
+ .skip(1)
+ .take_while(|it| it.as_node() != Some(next_use_tree.syntax()));
+ for sep in separators {
+ editor.delete(sep);
+ }
+ break;
+ }
+ }
+ editor.delete(self.syntax());
+ }
+}
+
#[cfg(test)]
mod tests {
use parser::Edition;