diff options
author | Aleksey Kladov <[email protected]> | 2019-02-03 18:26:35 +0000 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2019-02-06 14:00:00 +0000 |
commit | 0c5fd8f7cbf04eda763e55bc9a38dad5f7ec917d (patch) | |
tree | 4af15c8906b85de01a15c717bc1fac388952cd3d /crates/ra_assists/src/add_impl.rs | |
parent | 736a55c97e69f95e6ff4a0c3dafb2018e8ea05f9 (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.rs | 67 |
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 @@ | |||
1 | use join_to_string::join; | ||
2 | use hir::db::HirDatabase; | ||
3 | use ra_syntax::{ | ||
4 | ast::{self, AstNode, AstToken, NameOwner, TypeParamsOwner}, | ||
5 | TextUnit, | ||
6 | }; | ||
7 | |||
8 | use crate::{AssistCtx, Assist}; | ||
9 | |||
10 | pub(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)] | ||
44 | mod 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 | } | ||