diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-07-03 13:44:09 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2020-07-03 13:44:09 +0100 |
commit | f51b0cfdd6c23dd57a0a11154179730171c0425d (patch) | |
tree | f856e6b751b23a20d68e9df5350ec39d5e8ee85b /crates/ra_assists/src/handlers/add_impl.rs | |
parent | ef6a6d75d5dba2825e6b90e67e0b147a5f7158e1 (diff) | |
parent | 4c9347ecc3356748c52847a29d5e53a65778dc13 (diff) |
Merge #5116
5116: Categorize assists r=matklad a=kjeremy
Categorize assists so that editors can use them. Follows the LSP spec pretty close (and some things may need adjustments) but this populates the Refactor menu in vscode and pushes quickfixes through again.
This is a prerequisite to filtering out assists that the client doesn't care about.
Fixes #4147
Co-authored-by: Jeremy Kolb <[email protected]>
Co-authored-by: kjeremy <[email protected]>
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)] |