aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_assists/src/handlers/add_impl.rs
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2020-07-03 13:44:09 +0100
committerGitHub <[email protected]>2020-07-03 13:44:09 +0100
commitf51b0cfdd6c23dd57a0a11154179730171c0425d (patch)
treef856e6b751b23a20d68e9df5350ec39d5e8ee85b /crates/ra_assists/src/handlers/add_impl.rs
parentef6a6d75d5dba2825e6b90e67e0b147a5f7158e1 (diff)
parent4c9347ecc3356748c52847a29d5e53a65778dc13 (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.rs67
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 @@
1use ra_syntax::ast::{self, AstNode, NameOwner, TypeParamsOwner}; 1use ra_syntax::ast::{self, AstNode, NameOwner, TypeParamsOwner};
2use stdx::{format_to, SepBy}; 2use stdx::{format_to, SepBy};
3 3
4use crate::{AssistContext, AssistId, Assists}; 4use 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)]