diff options
Diffstat (limited to 'crates/ra_assists/src/handlers/add_impl.rs')
-rw-r--r-- | crates/ra_assists/src/handlers/add_impl.rs | 67 |
1 files changed, 37 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..2f603ef9c 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,45 @@ 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", AssistKind::Refactor), |
31 | let start_offset = nominal.syntax().text_range().end(); | 31 | format!("Implement {}", name.text().as_str()), |
32 | let mut buf = String::new(); | 32 | target, |
33 | buf.push_str("\n\nimpl"); | 33 | |edit| { |
34 | if let Some(type_params) = &type_params { | 34 | let type_params = nominal.type_param_list(); |
35 | format_to!(buf, "{}", type_params.syntax()); | 35 | let start_offset = nominal.syntax().text_range().end(); |
36 | } | 36 | let mut buf = String::new(); |
37 | buf.push_str(" "); | 37 | buf.push_str("\n\nimpl"); |
38 | buf.push_str(name.text().as_str()); | 38 | if let Some(type_params) = &type_params { |
39 | if let Some(type_params) = type_params { | 39 | format_to!(buf, "{}", type_params.syntax()); |
40 | let lifetime_params = type_params | 40 | } |
41 | .lifetime_params() | 41 | buf.push_str(" "); |
42 | .filter_map(|it| it.lifetime_token()) | 42 | buf.push_str(name.text().as_str()); |
43 | .map(|it| it.text().clone()); | 43 | if let Some(type_params) = type_params { |
44 | let type_params = | 44 | let lifetime_params = type_params |
45 | type_params.type_params().filter_map(|it| it.name()).map(|it| it.text().clone()); | 45 | .lifetime_params() |
46 | .filter_map(|it| it.lifetime_token()) | ||
47 | .map(|it| it.text().clone()); | ||
48 | let type_params = type_params | ||
49 | .type_params() | ||
50 | .filter_map(|it| it.name()) | ||
51 | .map(|it| it.text().clone()); | ||
46 | 52 | ||
47 | let generic_params = lifetime_params.chain(type_params).sep_by(", "); | 53 | let generic_params = lifetime_params.chain(type_params).sep_by(", "); |
48 | format_to!(buf, "<{}>", generic_params) | 54 | 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 | } | 55 | } |
55 | None => { | 56 | match ctx.config.snippet_cap { |
56 | buf.push_str(" {\n}"); | 57 | Some(cap) => { |
57 | edit.insert(start_offset, buf); | 58 | buf.push_str(" {\n $0\n}"); |
59 | edit.insert_snippet(cap, start_offset, buf); | ||
60 | } | ||
61 | None => { | ||
62 | buf.push_str(" {\n}"); | ||
63 | edit.insert(start_offset, buf); | ||
64 | } | ||
58 | } | 65 | } |
59 | } | 66 | }, |
60 | }) | 67 | ) |
61 | } | 68 | } |
62 | 69 | ||
63 | #[cfg(test)] | 70 | #[cfg(test)] |