Skip to content

Commit 94b3481

Browse files
committed
Deunwrap generate_derive
1 parent b78d69c commit 94b3481

File tree

1 file changed

+31
-19
lines changed

1 file changed

+31
-19
lines changed

crates/ide-assists/src/handlers/generate_derive.rs

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -27,33 +27,45 @@ pub(crate) fn generate_derive(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opt
2727
let cap = ctx.config.snippet_cap?;
2828
let nominal = ctx.find_node_at_offset::<ast::Adt>()?;
2929
let target = nominal.syntax().text_range();
30+
let derive_attr = nominal
31+
.attrs()
32+
.filter_map(|x| x.as_simple_call())
33+
.filter(|(name, _arg)| name == "derive")
34+
.map(|(_name, arg)| arg)
35+
.next();
36+
37+
let (derive, delimiter) = match &derive_attr {
38+
None => {
39+
let derive = make::attr_outer(make::meta_token_tree(
40+
make::ext::ident_path("derive"),
41+
make::token_tree(T!['('], vec![]).clone_for_update(),
42+
))
43+
.clone_for_update();
44+
let delimiter = derive.meta()?.token_tree()?.r_paren_token()?;
45+
(derive, delimiter)
46+
}
47+
Some(tt) => {
48+
// Create an outer attribute just so that we avoid using
49+
// unwrap in edit closure.
50+
let _derive = make::attr_outer(make::meta_token_tree(
51+
make::ext::ident_path("derive"),
52+
make::token_tree(T!['('], vec![]),
53+
));
54+
(_derive, tt.right_delimiter_token()?)
55+
}
56+
};
57+
3058
acc.add(AssistId("generate_derive", AssistKind::Generate), "Add `#[derive]`", target, |edit| {
31-
let derive_attr = nominal
32-
.attrs()
33-
.filter_map(|x| x.as_simple_call())
34-
.filter(|(name, _arg)| name == "derive")
35-
.map(|(_name, arg)| arg)
36-
.next();
3759
match derive_attr {
3860
None => {
39-
let derive = make::attr_outer(make::meta_token_tree(
40-
make::ext::ident_path("derive"),
41-
make::token_tree(T!['('], vec![]).clone_for_update(),
42-
))
43-
.clone_for_update();
44-
4561
let nominal = edit.make_mut(nominal);
4662
nominal.add_attr(derive.clone());
4763

48-
edit.add_tabstop_before_token(
49-
cap,
50-
derive.meta().unwrap().token_tree().unwrap().r_paren_token().unwrap(),
51-
);
64+
edit.add_tabstop_before_token(cap, delimiter);
5265
}
53-
Some(tt) => {
66+
Some(_) => {
5467
// Just move the cursor.
55-
let tt = edit.make_mut(tt);
56-
edit.add_tabstop_before_token(cap, tt.right_delimiter_token().unwrap());
68+
edit.add_tabstop_before_token(cap, delimiter);
5769
}
5870
};
5971
})

0 commit comments

Comments
 (0)