diff options
Diffstat (limited to 'crates/ide_assists/src/handlers')
-rw-r--r-- | crates/ide_assists/src/handlers/generate_enum_match_method.rs | 65 |
1 files changed, 28 insertions, 37 deletions
diff --git a/crates/ide_assists/src/handlers/generate_enum_match_method.rs b/crates/ide_assists/src/handlers/generate_enum_match_method.rs index 25565d4cc..b271b48b6 100644 --- a/crates/ide_assists/src/handlers/generate_enum_match_method.rs +++ b/crates/ide_assists/src/handlers/generate_enum_match_method.rs | |||
@@ -1,12 +1,9 @@ | |||
1 | use itertools::Itertools; | 1 | use itertools::Itertools; |
2 | use stdx::{format_to, to_lower_snake_case}; | 2 | use stdx::to_lower_snake_case; |
3 | use syntax::ast::VisibilityOwner; | 3 | use syntax::ast::VisibilityOwner; |
4 | use syntax::ast::{self, AstNode, NameOwner}; | 4 | use syntax::ast::{self, AstNode, NameOwner}; |
5 | 5 | ||
6 | use crate::{ | 6 | use crate::{AssistContext, AssistId, AssistKind, Assists, assist_context::AssistBuilder, utils::{find_impl_block_end, find_struct_impl, generate_impl_text}}; |
7 | utils::{find_impl_block_end, find_struct_impl, generate_impl_text}, | ||
8 | AssistContext, AssistId, AssistKind, Assists, | ||
9 | }; | ||
10 | 7 | ||
11 | // Assist: generate_enum_is_method | 8 | // Assist: generate_enum_is_method |
12 | // | 9 | // |
@@ -56,15 +53,8 @@ pub(crate) fn generate_enum_is_method(acc: &mut Assists, ctx: &AssistContext) -> | |||
56 | "Generate an `is_` method for an enum variant", | 53 | "Generate an `is_` method for an enum variant", |
57 | target, | 54 | target, |
58 | |builder| { | 55 | |builder| { |
59 | let mut buf = String::with_capacity(512); | ||
60 | |||
61 | if impl_def.is_some() { | ||
62 | buf.push('\n'); | ||
63 | } | ||
64 | |||
65 | let vis = parent_enum.visibility().map_or(String::new(), |v| format!("{} ", v)); | 56 | let vis = parent_enum.visibility().map_or(String::new(), |v| format!("{} ", v)); |
66 | format_to!( | 57 | let method = format!( |
67 | buf, | ||
68 | " /// Returns `true` if the {} is [`{}`]. | 58 | " /// Returns `true` if the {} is [`{}`]. |
69 | {}fn {}(&self) -> bool {{ | 59 | {}fn {}(&self) -> bool {{ |
70 | matches!(self, Self::{}{}) | 60 | matches!(self, Self::{}{}) |
@@ -77,14 +67,7 @@ pub(crate) fn generate_enum_is_method(acc: &mut Assists, ctx: &AssistContext) -> | |||
77 | variant_kind.pattern_suffix(), | 67 | variant_kind.pattern_suffix(), |
78 | ); | 68 | ); |
79 | 69 | ||
80 | let start_offset = impl_def | 70 | add_method_to_adt(builder, &parent_enum, impl_def, &method); |
81 | .and_then(|impl_def| find_impl_block_end(impl_def, &mut buf)) | ||
82 | .unwrap_or_else(|| { | ||
83 | buf = generate_impl_text(&parent_enum, &buf); | ||
84 | parent_enum.syntax().text_range().end() | ||
85 | }); | ||
86 | |||
87 | builder.insert(start_offset, buf); | ||
88 | }, | 71 | }, |
89 | ) | 72 | ) |
90 | } | 73 | } |
@@ -140,15 +123,8 @@ pub(crate) fn generate_enum_into_method(acc: &mut Assists, ctx: &AssistContext) | |||
140 | "Generate an `into_` method for an enum variant", | 123 | "Generate an `into_` method for an enum variant", |
141 | target, | 124 | target, |
142 | |builder| { | 125 | |builder| { |
143 | let mut buf = String::with_capacity(512); | ||
144 | |||
145 | if impl_def.is_some() { | ||
146 | buf.push('\n'); | ||
147 | } | ||
148 | |||
149 | let vis = parent_enum.visibility().map_or(String::new(), |v| format!("{} ", v)); | 126 | let vis = parent_enum.visibility().map_or(String::new(), |v| format!("{} ", v)); |
150 | format_to!( | 127 | let method = format!( |
151 | buf, | ||
152 | " {}fn {}(self) -> Option<{}> {{ | 128 | " {}fn {}(self) -> Option<{}> {{ |
153 | if let Self::{}{} = self {{ | 129 | if let Self::{}{} = self {{ |
154 | Some({}) | 130 | Some({}) |
@@ -164,18 +140,33 @@ pub(crate) fn generate_enum_into_method(acc: &mut Assists, ctx: &AssistContext) | |||
164 | bound_name, | 140 | bound_name, |
165 | ); | 141 | ); |
166 | 142 | ||
167 | let start_offset = impl_def | 143 | add_method_to_adt(builder, &parent_enum, impl_def, &method); |
168 | .and_then(|impl_def| find_impl_block_end(impl_def, &mut buf)) | ||
169 | .unwrap_or_else(|| { | ||
170 | buf = generate_impl_text(&parent_enum, &buf); | ||
171 | parent_enum.syntax().text_range().end() | ||
172 | }); | ||
173 | |||
174 | builder.insert(start_offset, buf); | ||
175 | }, | 144 | }, |
176 | ) | 145 | ) |
177 | } | 146 | } |
178 | 147 | ||
148 | fn add_method_to_adt( | ||
149 | builder: &mut AssistBuilder, | ||
150 | adt: &ast::Adt, | ||
151 | impl_def: Option<ast::Impl>, | ||
152 | method: &str, | ||
153 | ) { | ||
154 | let mut buf = String::with_capacity(method.len() + 2); | ||
155 | if impl_def.is_some() { | ||
156 | buf.push('\n'); | ||
157 | } | ||
158 | buf.push_str(method); | ||
159 | |||
160 | let start_offset = impl_def | ||
161 | .and_then(|impl_def| find_impl_block_end(impl_def, &mut buf)) | ||
162 | .unwrap_or_else(|| { | ||
163 | buf = generate_impl_text(&adt, &buf); | ||
164 | adt.syntax().text_range().end() | ||
165 | }); | ||
166 | |||
167 | builder.insert(start_offset, buf); | ||
168 | } | ||
169 | |||
179 | enum VariantKind { | 170 | enum VariantKind { |
180 | Unit, | 171 | Unit, |
181 | /// Tuple with a single field | 172 | /// Tuple with a single field |