diff --git a/crates/ide_assists/src/utils.rs b/crates/ide_assists/src/utils.rs index c5540fa842..718fbeda8d 100644 --- a/crates/ide_assists/src/utils.rs +++ b/crates/ide_assists/src/utils.rs @@ -13,6 +13,7 @@ use syntax::{ ast::{ self, edit::{self, AstNodeEdit}, + edit_in_place::AttrsOwnerEdit, make, ArgListOwner, AttrsOwner, GenericParamsOwner, NameOwner, TypeBoundsOwner, }, ted, AstNode, Direction, SmolStr, @@ -130,7 +131,7 @@ pub fn add_trait_assoc_items_to_impl( let items = items.into_iter().map(|assoc_item| { let assoc_item = assoc_item.clone_for_update(); transform.apply(assoc_item.syntax()); - edit::remove_attrs_and_docs(&assoc_item); + assoc_item.remove_attrs_and_docs(); assoc_item }); diff --git a/crates/ide_completion/src/completions/trait_impl.rs b/crates/ide_completion/src/completions/trait_impl.rs index aa110b0899..6ff7514187 100644 --- a/crates/ide_completion/src/completions/trait_impl.rs +++ b/crates/ide_completion/src/completions/trait_impl.rs @@ -34,7 +34,7 @@ use hir::{self, HasAttrs, HasSource}; use ide_db::{path_transform::PathTransform, traits::get_missing_assoc_items, SymbolKind}; use syntax::{ - ast::{self, edit}, + ast::{self, edit_in_place::AttrsOwnerEdit}, display::function_declaration, AstNode, SyntaxElement, SyntaxKind, SyntaxNode, SyntaxToken, TextRange, T, }; @@ -195,7 +195,7 @@ fn get_transformed_assoc_item( transform.apply(assoc_item.syntax()); if let ast::AssocItem::Fn(func) = &assoc_item { - edit::remove_attrs_and_docs(func) + func.remove_attrs_and_docs() } Some(assoc_item) } @@ -253,7 +253,7 @@ fn add_const_impl( } fn make_const_compl_syntax(const_: &ast::Const) -> String { - edit::remove_attrs_and_docs(const_); + const_.remove_attrs_and_docs(); let const_start = const_.syntax().text_range().start(); let const_end = const_.syntax().text_range().end(); diff --git a/crates/syntax/src/ast/edit.rs b/crates/syntax/src/ast/edit.rs index 01d6add36d..54ee19a626 100644 --- a/crates/syntax/src/ast/edit.rs +++ b/crates/syntax/src/ast/edit.rs @@ -6,9 +6,7 @@ use std::{fmt, iter, ops}; use crate::{ algo, ast::{self, make, AstNode}, - ted, AstToken, NodeOrToken, SyntaxElement, - SyntaxKind::{ATTR, COMMENT, WHITESPACE}, - SyntaxNode, SyntaxToken, + ted, AstToken, NodeOrToken, SyntaxElement, SyntaxNode, SyntaxToken, }; impl ast::UseTree { @@ -48,28 +46,6 @@ impl ast::UseTree { } } -pub fn remove_attrs_and_docs(node: &N) { - remove_attrs_and_docs_inner(node.syntax()) -} - -fn remove_attrs_and_docs_inner(node: &SyntaxNode) { - let mut remove_next_ws = false; - for child in node.children_with_tokens() { - match child.kind() { - ATTR | COMMENT => { - remove_next_ws = true; - child.detach(); - continue; - } - WHITESPACE if remove_next_ws => { - child.detach(); - } - _ => (), - } - remove_next_ws = false; - } -} - #[derive(Debug, Clone, Copy)] pub struct IndentLevel(pub u8); diff --git a/crates/syntax/src/ast/edit_in_place.rs b/crates/syntax/src/ast/edit_in_place.rs index e9280ab45c..3bee11ee03 100644 --- a/crates/syntax/src/ast/edit_in_place.rs +++ b/crates/syntax/src/ast/edit_in_place.rs @@ -13,7 +13,9 @@ use crate::{ make, GenericParamsOwner, }, ted::{self, Position}, - AstNode, AstToken, Direction, SyntaxNode, + AstNode, AstToken, Direction, + SyntaxKind::{ATTR, COMMENT, WHITESPACE}, + SyntaxNode, }; use super::NameOwner; @@ -196,6 +198,32 @@ fn create_generic_param_list(position: Position) -> ast::GenericParamList { gpl } +pub trait AttrsOwnerEdit: ast::AttrsOwner + AstNodeEdit { + fn remove_attrs_and_docs(&self) { + remove_attrs_and_docs(self.syntax()); + + fn remove_attrs_and_docs(node: &SyntaxNode) { + let mut remove_next_ws = false; + for child in node.children_with_tokens() { + match child.kind() { + ATTR | COMMENT => { + remove_next_ws = true; + child.detach(); + continue; + } + WHITESPACE if remove_next_ws => { + child.detach(); + } + _ => (), + } + remove_next_ws = false; + } + } + } +} + +impl AttrsOwnerEdit for T {} + impl ast::GenericParamList { pub fn add_generic_param(&self, generic_param: ast::GenericParam) { match self.generic_params().last() {