diff options
Diffstat (limited to 'crates/ra_assists/src/handlers/add_impl.rs')
-rw-r--r-- | crates/ra_assists/src/handlers/add_impl.rs | 68 |
1 files changed, 38 insertions, 30 deletions
diff --git a/crates/ra_assists/src/handlers/add_impl.rs b/crates/ra_assists/src/handlers/add_impl.rs index eceba7d0a..405e3c568 100644 --- a/crates/ra_assists/src/handlers/add_impl.rs +++ b/crates/ra_assists/src/handlers/add_impl.rs | |||
@@ -1,7 +1,7 @@ | |||
1 | use ra_syntax::ast::{self, AstNode, NameOwner, TypeParamsOwner}; | 1 | use ra_syntax::ast::{self, AstNode, NameOwner, TypeParamsOwner}; |
2 | use stdx::{format_to, SepBy}; | 2 | use stdx::{format_to, SepBy}; |
3 | 3 | ||
4 | use crate::{AssistContext, AssistId, Assists}; | 4 | use crate::{AssistContext, AssistId, AssistKind, Assists}; |
5 | 5 | ||
6 | // Assist: add_impl | 6 | // Assist: add_impl |
7 | // | 7 | // |
@@ -26,38 +26,46 @@ pub(crate) fn add_impl(acc: &mut Assists, ctx: &AssistContext) -> Option<()> { | |||
26 | let nominal = ctx.find_node_at_offset::<ast::NominalDef>()?; | 26 | let nominal = ctx.find_node_at_offset::<ast::NominalDef>()?; |
27 | let name = nominal.name()?; | 27 | let name = nominal.name()?; |
28 | let target = nominal.syntax().text_range(); | 28 | let target = nominal.syntax().text_range(); |
29 | acc.add(AssistId("add_impl"), format!("Implement {}", name.text().as_str()), target, |edit| { | 29 | acc.add( |
30 | let type_params = nominal.type_param_list(); | 30 | AssistId("add_impl"), |
31 | let start_offset = nominal.syntax().text_range().end(); | 31 | AssistKind::Refactor, |
32 | let mut buf = String::new(); | 32 | format!("Implement {}", name.text().as_str()), |
33 | buf.push_str("\n\nimpl"); | 33 | target, |
34 | if let Some(type_params) = &type_params { | 34 | |edit| { |
35 | format_to!(buf, "{}", type_params.syntax()); | 35 | let type_params = nominal.type_param_list(); |
36 | } | 36 | let start_offset = nominal.syntax().text_range().end(); |
37 | buf.push_str(" "); | 37 | let mut buf = String::new(); |
38 | buf.push_str(name.text().as_str()); | 38 | buf.push_str("\n\nimpl"); |
39 | if let Some(type_params) = type_params { | 39 | if let Some(type_params) = &type_params { |
40 | let lifetime_params = type_params | 40 | format_to!(buf, "{}", type_params.syntax()); |
41 | .lifetime_params() | 41 | } |
42 | .filter_map(|it| it.lifetime_token()) | 42 | buf.push_str(" "); |
43 | .map(|it| it.text().clone()); | 43 | buf.push_str(name.text().as_str()); |
44 | let type_params = | 44 | if let Some(type_params) = type_params { |
45 | type_params.type_params().filter_map(|it| it.name()).map(|it| it.text().clone()); | 45 | let lifetime_params = type_params |
46 | .lifetime_params() | ||
47 | .filter_map(|it| it.lifetime_token()) | ||
48 | .map(|it| it.text().clone()); | ||
49 | let type_params = type_params | ||
50 | .type_params() | ||
51 | .filter_map(|it| it.name()) | ||
52 | .map(|it| it.text().clone()); | ||
46 | 53 | ||
47 | let generic_params = lifetime_params.chain(type_params).sep_by(", "); | 54 | let generic_params = lifetime_params.chain(type_params).sep_by(", "); |
48 | format_to!(buf, "<{}>", generic_params) | 55 | format_to!(buf, "<{}>", generic_params) |
49 | } | ||
50 | match ctx.config.snippet_cap { | ||
51 | Some(cap) => { | ||
52 | buf.push_str(" {\n $0\n}"); | ||
53 | edit.insert_snippet(cap, start_offset, buf); | ||
54 | } | 56 | } |
55 | None => { | 57 | match ctx.config.snippet_cap { |
56 | buf.push_str(" {\n}"); | 58 | Some(cap) => { |
57 | edit.insert(start_offset, buf); | 59 | buf.push_str(" {\n $0\n}"); |
60 | edit.insert_snippet(cap, start_offset, buf); | ||
61 | } | ||
62 | None => { | ||
63 | buf.push_str(" {\n}"); | ||
64 | edit.insert(start_offset, buf); | ||
65 | } | ||
58 | } | 66 | } |
59 | } | 67 | }, |
60 | }) | 68 | ) |
61 | } | 69 | } |
62 | 70 | ||
63 | #[cfg(test)] | 71 | #[cfg(test)] |