aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_assists/src/add_impl.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-02-03 18:26:35 +0000
committerAleksey Kladov <[email protected]>2019-02-06 14:00:00 +0000
commit0c5fd8f7cbf04eda763e55bc9a38dad5f7ec917d (patch)
tree4af15c8906b85de01a15c717bc1fac388952cd3d /crates/ra_assists/src/add_impl.rs
parent736a55c97e69f95e6ff4a0c3dafb2018e8ea05f9 (diff)
move assists to a separate crate
Diffstat (limited to 'crates/ra_assists/src/add_impl.rs')
-rw-r--r--crates/ra_assists/src/add_impl.rs67
1 files changed, 67 insertions, 0 deletions
diff --git a/crates/ra_assists/src/add_impl.rs b/crates/ra_assists/src/add_impl.rs
new file mode 100644
index 000000000..699508f91
--- /dev/null
+++ b/crates/ra_assists/src/add_impl.rs
@@ -0,0 +1,67 @@
1use join_to_string::join;
2use hir::db::HirDatabase;
3use ra_syntax::{
4 ast::{self, AstNode, AstToken, NameOwner, TypeParamsOwner},
5 TextUnit,
6};
7
8use crate::{AssistCtx, Assist};
9
10pub(crate) fn add_impl(ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> {
11 let nominal = ctx.node_at_offset::<ast::NominalDef>()?;
12 let name = nominal.name()?;
13 ctx.build("add impl", |edit| {
14 let type_params = nominal.type_param_list();
15 let start_offset = nominal.syntax().range().end();
16 let mut buf = String::new();
17 buf.push_str("\n\nimpl");
18 if let Some(type_params) = type_params {
19 type_params.syntax().text().push_to(&mut buf);
20 }
21 buf.push_str(" ");
22 buf.push_str(name.text().as_str());
23 if let Some(type_params) = type_params {
24 let lifetime_params = type_params
25 .lifetime_params()
26 .filter_map(|it| it.lifetime())
27 .map(|it| it.text());
28 let type_params = type_params
29 .type_params()
30 .filter_map(|it| it.name())
31 .map(|it| it.text());
32 join(lifetime_params.chain(type_params))
33 .surround_with("<", ">")
34 .to_buf(&mut buf);
35 }
36 buf.push_str(" {\n");
37 edit.set_cursor(start_offset + TextUnit::of_str(&buf));
38 buf.push_str("\n}");
39 edit.insert(start_offset, buf);
40 })
41}
42
43#[cfg(test)]
44mod tests {
45 use super::*;
46 use crate::helpers::check_assist;
47
48 #[test]
49 fn test_add_impl() {
50 check_assist(
51 add_impl,
52 "struct Foo {<|>}\n",
53 "struct Foo {}\n\nimpl Foo {\n<|>\n}\n",
54 );
55 check_assist(
56 add_impl,
57 "struct Foo<T: Clone> {<|>}",
58 "struct Foo<T: Clone> {}\n\nimpl<T: Clone> Foo<T> {\n<|>\n}",
59 );
60 check_assist(
61 add_impl,
62 "struct Foo<'a, T: Foo<'a>> {<|>}",
63 "struct Foo<'a, T: Foo<'a>> {}\n\nimpl<'a, T: Foo<'a>> Foo<'a, T> {\n<|>\n}",
64 );
65 }
66
67}