Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-assists/src/handlers/generate_derive.rs')
-rw-r--r--crates/ide-assists/src/handlers/generate_derive.rs25
1 files changed, 20 insertions, 5 deletions
diff --git a/crates/ide-assists/src/handlers/generate_derive.rs b/crates/ide-assists/src/handlers/generate_derive.rs
index 73a69c82fb..06fef4af22 100644
--- a/crates/ide-assists/src/handlers/generate_derive.rs
+++ b/crates/ide-assists/src/handlers/generate_derive.rs
@@ -1,6 +1,8 @@
use syntax::{
+ SyntaxKind::{ATTR, COMMENT, WHITESPACE},
T,
- ast::{self, AstNode, HasAttrs, edit_in_place::AttrsOwnerEdit, make},
+ ast::{self, AstNode, HasAttrs, edit::IndentLevel, make},
+ syntax_editor::{Element, Position},
};
use crate::{AssistContext, AssistId, Assists};
@@ -48,8 +50,20 @@ pub(crate) fn generate_derive(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opt
))
.clone_for_update();
- let nominal = edit.make_mut(nominal);
- nominal.add_attr(derive.clone());
+ let mut editor = edit.make_editor(nominal.syntax());
+ let indent = IndentLevel::from_node(nominal.syntax());
+ let after_attrs_and_comments = nominal
+ .syntax()
+ .children_with_tokens()
+ .find(|it| !matches!(it.kind(), WHITESPACE | COMMENT | ATTR))
+ .map_or(Position::first_child_of(nominal.syntax()), Position::before);
+ editor.insert_all(
+ after_attrs_and_comments,
+ vec![
+ derive.syntax().syntax_element(),
+ make::tokens::whitespace(&format!("\n{indent}")).syntax_element(),
+ ],
+ );
let delimiter = derive
.meta()
@@ -58,8 +72,9 @@ pub(crate) fn generate_derive(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opt
.expect("failed to get token tree out of Meta")
.r_paren_token()
.expect("make::attr_outer was expected to have a R_PAREN");
-
- edit.add_tabstop_before_token(cap, delimiter);
+ let tabstop_before = edit.make_tabstop_before(cap);
+ editor.add_annotation(delimiter, tabstop_before);
+ edit.add_file_edits(ctx.vfs_file_id(), editor);
}
Some(_) => {
// Just move the cursor.