aboutsummaryrefslogtreecommitdiff
path: root/crates/assists/src/handlers/generate_enum_match_method.rs
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2021-02-05 17:18:02 +0000
committerGitHub <[email protected]>2021-02-05 17:18:02 +0000
commit80ab753d7e0bf59b81df317d6ddda43cb919ec83 (patch)
tree934a7ae2d8b549cd9d5d82a137156c0a71220973 /crates/assists/src/handlers/generate_enum_match_method.rs
parent941f9157f5561868c4683d54fdf98378383f64b8 (diff)
parent2cf161266941eac300ae66a633ead26f5109ea16 (diff)
Merge #7572
7572: Add `find_or_create_impl_block` to assist utils r=matklad a=yoshuawuyts This is another continuation of https://github.com/rust-analyzer/rust-analyzer/pull/7562, introducing a small util to either find an `impl` block, or create a new one if none exists. I copied this code from the `generate_new` assist into https://github.com/rust-analyzer/rust-analyzer/pull/7562, and this unifies both into a helper. It doesn't feel super polished in its current state, but my hope is that this is enough of a starting point that it can be expanded on later. For example something that would be useful would be a flag which either returns the index of the start of the block, or the end of the block. Anyway, I hope this is useful. Thanks! Co-authored-by: Yoshua Wuyts <[email protected]>
Diffstat (limited to 'crates/assists/src/handlers/generate_enum_match_method.rs')
-rw-r--r--crates/assists/src/handlers/generate_enum_match_method.rs20
1 files changed, 6 insertions, 14 deletions
diff --git a/crates/assists/src/handlers/generate_enum_match_method.rs b/crates/assists/src/handlers/generate_enum_match_method.rs
index ee89d4208..4cf66b5d5 100644
--- a/crates/assists/src/handlers/generate_enum_match_method.rs
+++ b/crates/assists/src/handlers/generate_enum_match_method.rs
@@ -1,9 +1,12 @@
1use stdx::{format_to, to_lower_snake_case}; 1use stdx::{format_to, to_lower_snake_case};
2use syntax::ast::VisibilityOwner;
2use syntax::ast::{self, AstNode, NameOwner}; 3use syntax::ast::{self, AstNode, NameOwner};
3use syntax::{ast::VisibilityOwner, T};
4use test_utils::mark; 4use test_utils::mark;
5 5
6use crate::{utils::find_struct_impl, AssistContext, AssistId, AssistKind, Assists}; 6use crate::{
7 utils::{find_impl_block, find_struct_impl},
8 AssistContext, AssistId, AssistKind, Assists,
9};
7 10
8// Assist: generate_enum_match_method 11// Assist: generate_enum_match_method
9// 12//
@@ -63,7 +66,6 @@ pub(crate) fn generate_enum_match_method(acc: &mut Assists, ctx: &AssistContext)
63 } 66 }
64 67
65 let vis = parent_enum.visibility().map_or(String::new(), |v| format!("{} ", v)); 68 let vis = parent_enum.visibility().map_or(String::new(), |v| format!("{} ", v));
66
67 format_to!( 69 format_to!(
68 buf, 70 buf,
69 " /// Returns `true` if the {} is [`{}`]. 71 " /// Returns `true` if the {} is [`{}`].
@@ -78,17 +80,7 @@ pub(crate) fn generate_enum_match_method(acc: &mut Assists, ctx: &AssistContext)
78 ); 80 );
79 81
80 let start_offset = impl_def 82 let start_offset = impl_def
81 .and_then(|impl_def| { 83 .and_then(|impl_def| find_impl_block(impl_def, &mut buf))
82 buf.push('\n');
83 let start = impl_def
84 .syntax()
85 .descendants_with_tokens()
86 .find(|t| t.kind() == T!['{'])?
87 .text_range()
88 .end();
89
90 Some(start)
91 })
92 .unwrap_or_else(|| { 84 .unwrap_or_else(|| {
93 buf = generate_impl_text(&parent_enum, &buf); 85 buf = generate_impl_text(&parent_enum, &buf);
94 parent_enum.syntax().text_range().end() 86 parent_enum.syntax().text_range().end()