use syntax::{
- ast::{self, AstNode},
+ ast::{self, edit::IndentLevel, AstNode},
match_ast,
};
let item = ctx.find_node_at_offset::<ast::Item>()?;
let insert = match_ast! {
match (item.syntax().parent()?) {
- ast::AssocItemList(it) => it.syntax().parent()?.text_range().start(),
- _ => item.syntax().text_range().start(),
+ ast::AssocItemList(it) => it.syntax().parent()?.clone(),
+ _ => item.syntax().clone(),
}
};
+ let indent = IndentLevel::from_node(&insert);
+ let insert = insert.text_range().start();
let target = node.syntax().text_range();
acc.add(
builder.replace(target, "Type");
match ctx.config.snippet_cap {
Some(cap) => {
- builder.insert_snippet(cap, insert, format!("type $0Type = {};\n\n", node));
+ builder.insert_snippet(
+ cap,
+ insert,
+ format!("type $0Type = {};\n\n{}", node, indent),
+ );
}
None => {
- builder.insert(insert, format!("type Type = {};\n\n", node));
+ builder.insert(insert, format!("type Type = {};\n\n{}", node, indent));
}
}
},
"#,
);
}
+
+ #[test]
+ fn indentation() {
+ check_assist(
+ extract_type_alias,
+ r#"
+mod m {
+ fn f() -> $0u8$0 {}
+}
+ "#,
+ r#"
+mod m {
+ type $0Type = u8;
+
+ fn f() -> Type {}
+}
+ "#,
+ );
+ }
}