diff options
author | Aleksey Kladov <[email protected]> | 2021-06-17 18:58:05 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2021-06-17 19:04:12 +0100 |
commit | ca99aaa053c7915633a1b2dadd40ad0deb3a3ac3 (patch) | |
tree | 0c7bf1f81bd6c6b9b57d0c34acc6dfd16af0b23a /crates/ide_assists | |
parent | 82c7afc70354c15454207ef8ffd2f7274330c3ed (diff) |
internal: add From to minicore
Diffstat (limited to 'crates/ide_assists')
-rw-r--r-- | crates/ide_assists/src/handlers/convert_into_to_from.rs | 44 | ||||
-rw-r--r-- | crates/ide_assists/src/handlers/generate_from_impl_for_enum.rs | 105 |
2 files changed, 99 insertions, 50 deletions
diff --git a/crates/ide_assists/src/handlers/convert_into_to_from.rs b/crates/ide_assists/src/handlers/convert_into_to_from.rs index 199e1ad5c..79a0c4879 100644 --- a/crates/ide_assists/src/handlers/convert_into_to_from.rs +++ b/crates/ide_assists/src/handlers/convert_into_to_from.rs | |||
@@ -6,6 +6,8 @@ use syntax::ast::{self, AstNode, NameOwner}; | |||
6 | 6 | ||
7 | use crate::{AssistContext, AssistId, AssistKind, Assists}; | 7 | use crate::{AssistContext, AssistId, AssistKind, Assists}; |
8 | 8 | ||
9 | // FIXME: this should be a diagnostic | ||
10 | |||
9 | // Assist: convert_into_to_from | 11 | // Assist: convert_into_to_from |
10 | // | 12 | // |
11 | // Converts an Into impl to an equivalent From impl. | 13 | // Converts an Into impl to an equivalent From impl. |
@@ -114,12 +116,14 @@ pub(crate) fn convert_into_to_from(acc: &mut Assists, ctx: &AssistContext) -> Op | |||
114 | mod tests { | 116 | mod tests { |
115 | use super::*; | 117 | use super::*; |
116 | 118 | ||
117 | use crate::tests::check_assist; | 119 | use crate::tests::{check_assist, check_assist_not_applicable}; |
118 | 120 | ||
119 | #[test] | 121 | #[test] |
120 | fn convert_into_to_from_converts_a_struct() { | 122 | fn convert_into_to_from_converts_a_struct() { |
121 | check_convert_into_to_from( | 123 | check_assist( |
124 | convert_into_to_from, | ||
122 | r#" | 125 | r#" |
126 | //- minicore: from | ||
123 | struct Thing { | 127 | struct Thing { |
124 | a: String, | 128 | a: String, |
125 | b: usize | 129 | b: usize |
@@ -154,8 +158,10 @@ impl From<usize> for Thing { | |||
154 | 158 | ||
155 | #[test] | 159 | #[test] |
156 | fn convert_into_to_from_converts_enums() { | 160 | fn convert_into_to_from_converts_enums() { |
157 | check_convert_into_to_from( | 161 | check_assist( |
162 | convert_into_to_from, | ||
158 | r#" | 163 | r#" |
164 | //- minicore: from | ||
159 | enum Thing { | 165 | enum Thing { |
160 | Foo(String), | 166 | Foo(String), |
161 | Bar(String) | 167 | Bar(String) |
@@ -190,8 +196,10 @@ impl From<Thing> for String { | |||
190 | 196 | ||
191 | #[test] | 197 | #[test] |
192 | fn convert_into_to_from_on_enum_with_lifetimes() { | 198 | fn convert_into_to_from_on_enum_with_lifetimes() { |
193 | check_convert_into_to_from( | 199 | check_assist( |
200 | convert_into_to_from, | ||
194 | r#" | 201 | r#" |
202 | //- minicore: from | ||
195 | enum Thing<'a> { | 203 | enum Thing<'a> { |
196 | Foo(&'a str), | 204 | Foo(&'a str), |
197 | Bar(&'a str) | 205 | Bar(&'a str) |
@@ -226,8 +234,10 @@ impl<'a> From<Thing<'a>> for &'a str { | |||
226 | 234 | ||
227 | #[test] | 235 | #[test] |
228 | fn convert_into_to_from_works_on_references() { | 236 | fn convert_into_to_from_works_on_references() { |
229 | check_convert_into_to_from( | 237 | check_assist( |
238 | convert_into_to_from, | ||
230 | r#" | 239 | r#" |
240 | //- minicore: from | ||
231 | struct Thing(String); | 241 | struct Thing(String); |
232 | 242 | ||
233 | impl $0core::convert::Into<String> for &Thing { | 243 | impl $0core::convert::Into<String> for &Thing { |
@@ -250,8 +260,10 @@ impl From<&Thing> for String { | |||
250 | 260 | ||
251 | #[test] | 261 | #[test] |
252 | fn convert_into_to_from_works_on_qualified_structs() { | 262 | fn convert_into_to_from_works_on_qualified_structs() { |
253 | check_convert_into_to_from( | 263 | check_assist( |
264 | convert_into_to_from, | ||
254 | r#" | 265 | r#" |
266 | //- minicore: from | ||
255 | mod things { | 267 | mod things { |
256 | pub struct Thing(String); | 268 | pub struct Thing(String); |
257 | pub struct BetterThing(String); | 269 | pub struct BetterThing(String); |
@@ -280,8 +292,10 @@ impl From<&things::Thing> for things::BetterThing { | |||
280 | 292 | ||
281 | #[test] | 293 | #[test] |
282 | fn convert_into_to_from_works_on_qualified_enums() { | 294 | fn convert_into_to_from_works_on_qualified_enums() { |
283 | check_convert_into_to_from( | 295 | check_assist( |
296 | convert_into_to_from, | ||
284 | r#" | 297 | r#" |
298 | //- minicore: from | ||
285 | mod things { | 299 | mod things { |
286 | pub enum Thing { | 300 | pub enum Thing { |
287 | A(String) | 301 | A(String) |
@@ -323,10 +337,12 @@ impl From<&things::Thing> for things::BetterThing { | |||
323 | #[test] | 337 | #[test] |
324 | fn convert_into_to_from_not_applicable_on_any_trait_named_into() { | 338 | fn convert_into_to_from_not_applicable_on_any_trait_named_into() { |
325 | check_assist_not_applicable( | 339 | check_assist_not_applicable( |
340 | convert_into_to_from, | ||
326 | r#" | 341 | r#" |
327 | pub trait Into<T> {{ | 342 | //- minicore: from |
343 | pub trait Into<T> { | ||
328 | pub fn into(self) -> T; | 344 | pub fn into(self) -> T; |
329 | }} | 345 | } |
330 | 346 | ||
331 | struct Thing { | 347 | struct Thing { |
332 | a: String, | 348 | a: String, |
@@ -342,14 +358,4 @@ impl $0Into<Thing> for String { | |||
342 | "#, | 358 | "#, |
343 | ); | 359 | ); |
344 | } | 360 | } |
345 | |||
346 | fn check_convert_into_to_from(before: &str, after: &str) { | ||
347 | let before = &format!("//- /main.rs crate:main deps:core{}{}", before, FamousDefs::FIXTURE); | ||
348 | check_assist(convert_into_to_from, before, after); | ||
349 | } | ||
350 | |||
351 | fn check_assist_not_applicable(before: &str) { | ||
352 | let before = &format!("//- /main.rs crate:main deps:core{}{}", before, FamousDefs::FIXTURE); | ||
353 | crate::tests::check_assist_not_applicable(convert_into_to_from, before); | ||
354 | } | ||
355 | } | 361 | } |
diff --git a/crates/ide_assists/src/handlers/generate_from_impl_for_enum.rs b/crates/ide_assists/src/handlers/generate_from_impl_for_enum.rs index ce6998d82..8727be07d 100644 --- a/crates/ide_assists/src/handlers/generate_from_impl_for_enum.rs +++ b/crates/ide_assists/src/handlers/generate_from_impl_for_enum.rs | |||
@@ -110,14 +110,19 @@ mod tests { | |||
110 | fn test_generate_from_impl_for_enum() { | 110 | fn test_generate_from_impl_for_enum() { |
111 | check_assist( | 111 | check_assist( |
112 | generate_from_impl_for_enum, | 112 | generate_from_impl_for_enum, |
113 | "enum A { $0One(u32) }", | 113 | r#" |
114 | r#"enum A { One(u32) } | 114 | //- minicore: from |
115 | enum A { $0One(u32) } | ||
116 | "#, | ||
117 | r#" | ||
118 | enum A { One(u32) } | ||
115 | 119 | ||
116 | impl From<u32> for A { | 120 | impl From<u32> for A { |
117 | fn from(v: u32) -> Self { | 121 | fn from(v: u32) -> Self { |
118 | Self::One(v) | 122 | Self::One(v) |
119 | } | 123 | } |
120 | }"#, | 124 | } |
125 | "#, | ||
121 | ); | 126 | ); |
122 | } | 127 | } |
123 | 128 | ||
@@ -125,53 +130,71 @@ impl From<u32> for A { | |||
125 | fn test_generate_from_impl_for_enum_complicated_path() { | 130 | fn test_generate_from_impl_for_enum_complicated_path() { |
126 | check_assist( | 131 | check_assist( |
127 | generate_from_impl_for_enum, | 132 | generate_from_impl_for_enum, |
128 | r#"enum A { $0One(foo::bar::baz::Boo) }"#, | 133 | r#" |
129 | r#"enum A { One(foo::bar::baz::Boo) } | 134 | //- minicore: from |
135 | enum A { $0One(foo::bar::baz::Boo) } | ||
136 | "#, | ||
137 | r#" | ||
138 | enum A { One(foo::bar::baz::Boo) } | ||
130 | 139 | ||
131 | impl From<foo::bar::baz::Boo> for A { | 140 | impl From<foo::bar::baz::Boo> for A { |
132 | fn from(v: foo::bar::baz::Boo) -> Self { | 141 | fn from(v: foo::bar::baz::Boo) -> Self { |
133 | Self::One(v) | 142 | Self::One(v) |
134 | } | 143 | } |
135 | }"#, | 144 | } |
145 | "#, | ||
136 | ); | 146 | ); |
137 | } | 147 | } |
138 | 148 | ||
139 | fn check_not_applicable(ra_fixture: &str) { | ||
140 | let fixture = | ||
141 | format!("//- /main.rs crate:main deps:core\n{}\n{}", ra_fixture, FamousDefs::FIXTURE); | ||
142 | check_assist_not_applicable(generate_from_impl_for_enum, &fixture) | ||
143 | } | ||
144 | |||
145 | #[test] | 149 | #[test] |
146 | fn test_add_from_impl_no_element() { | 150 | fn test_add_from_impl_no_element() { |
147 | check_not_applicable("enum A { $0One }"); | 151 | check_assist_not_applicable( |
152 | generate_from_impl_for_enum, | ||
153 | r#" | ||
154 | //- minicore: from | ||
155 | enum A { $0One } | ||
156 | "#, | ||
157 | ); | ||
148 | } | 158 | } |
149 | 159 | ||
150 | #[test] | 160 | #[test] |
151 | fn test_add_from_impl_more_than_one_element_in_tuple() { | 161 | fn test_add_from_impl_more_than_one_element_in_tuple() { |
152 | check_not_applicable("enum A { $0One(u32, String) }"); | 162 | check_assist_not_applicable( |
163 | generate_from_impl_for_enum, | ||
164 | r#" | ||
165 | //- minicore: from | ||
166 | enum A { $0One(u32, String) } | ||
167 | "#, | ||
168 | ); | ||
153 | } | 169 | } |
154 | 170 | ||
155 | #[test] | 171 | #[test] |
156 | fn test_add_from_impl_struct_variant() { | 172 | fn test_add_from_impl_struct_variant() { |
157 | check_assist( | 173 | check_assist( |
158 | generate_from_impl_for_enum, | 174 | generate_from_impl_for_enum, |
159 | "enum A { $0One { x: u32 } }", | 175 | r#" |
160 | r#"enum A { One { x: u32 } } | 176 | //- minicore: from |
177 | enum A { $0One { x: u32 } } | ||
178 | "#, | ||
179 | r#" | ||
180 | enum A { One { x: u32 } } | ||
161 | 181 | ||
162 | impl From<u32> for A { | 182 | impl From<u32> for A { |
163 | fn from(x: u32) -> Self { | 183 | fn from(x: u32) -> Self { |
164 | Self::One { x } | 184 | Self::One { x } |
165 | } | 185 | } |
166 | }"#, | 186 | } |
187 | "#, | ||
167 | ); | 188 | ); |
168 | } | 189 | } |
169 | 190 | ||
170 | #[test] | 191 | #[test] |
171 | fn test_add_from_impl_already_exists() { | 192 | fn test_add_from_impl_already_exists() { |
172 | cov_mark::check!(test_add_from_impl_already_exists); | 193 | cov_mark::check!(test_add_from_impl_already_exists); |
173 | check_not_applicable( | 194 | check_assist_not_applicable( |
195 | generate_from_impl_for_enum, | ||
174 | r#" | 196 | r#" |
197 | //- minicore: from | ||
175 | enum A { $0One(u32), } | 198 | enum A { $0One(u32), } |
176 | 199 | ||
177 | impl From<u32> for A { | 200 | impl From<u32> for A { |
@@ -187,7 +210,9 @@ impl From<u32> for A { | |||
187 | fn test_add_from_impl_different_variant_impl_exists() { | 210 | fn test_add_from_impl_different_variant_impl_exists() { |
188 | check_assist( | 211 | check_assist( |
189 | generate_from_impl_for_enum, | 212 | generate_from_impl_for_enum, |
190 | r#"enum A { $0One(u32), Two(String), } | 213 | r#" |
214 | //- minicore: from | ||
215 | enum A { $0One(u32), Two(String), } | ||
191 | 216 | ||
192 | impl From<String> for A { | 217 | impl From<String> for A { |
193 | fn from(v: String) -> Self { | 218 | fn from(v: String) -> Self { |
@@ -197,8 +222,10 @@ impl From<String> for A { | |||
197 | 222 | ||
198 | pub trait From<T> { | 223 | pub trait From<T> { |
199 | fn from(T) -> Self; | 224 | fn from(T) -> Self; |
200 | }"#, | 225 | } |
201 | r#"enum A { One(u32), Two(String), } | 226 | "#, |
227 | r#" | ||
228 | enum A { One(u32), Two(String), } | ||
202 | 229 | ||
203 | impl From<u32> for A { | 230 | impl From<u32> for A { |
204 | fn from(v: u32) -> Self { | 231 | fn from(v: u32) -> Self { |
@@ -214,7 +241,8 @@ impl From<String> for A { | |||
214 | 241 | ||
215 | pub trait From<T> { | 242 | pub trait From<T> { |
216 | fn from(T) -> Self; | 243 | fn from(T) -> Self; |
217 | }"#, | 244 | } |
245 | "#, | ||
218 | ); | 246 | ); |
219 | } | 247 | } |
220 | 248 | ||
@@ -222,14 +250,19 @@ pub trait From<T> { | |||
222 | fn test_add_from_impl_static_str() { | 250 | fn test_add_from_impl_static_str() { |
223 | check_assist( | 251 | check_assist( |
224 | generate_from_impl_for_enum, | 252 | generate_from_impl_for_enum, |
225 | "enum A { $0One(&'static str) }", | 253 | r#" |
226 | r#"enum A { One(&'static str) } | 254 | //- minicore: from |
255 | enum A { $0One(&'static str) } | ||
256 | "#, | ||
257 | r#" | ||
258 | enum A { One(&'static str) } | ||
227 | 259 | ||
228 | impl From<&'static str> for A { | 260 | impl From<&'static str> for A { |
229 | fn from(v: &'static str) -> Self { | 261 | fn from(v: &'static str) -> Self { |
230 | Self::One(v) | 262 | Self::One(v) |
231 | } | 263 | } |
232 | }"#, | 264 | } |
265 | "#, | ||
233 | ); | 266 | ); |
234 | } | 267 | } |
235 | 268 | ||
@@ -237,14 +270,19 @@ impl From<&'static str> for A { | |||
237 | fn test_add_from_impl_generic_enum() { | 270 | fn test_add_from_impl_generic_enum() { |
238 | check_assist( | 271 | check_assist( |
239 | generate_from_impl_for_enum, | 272 | generate_from_impl_for_enum, |
240 | "enum Generic<T, U: Clone> { $0One(T), Two(U) }", | 273 | r#" |
241 | r#"enum Generic<T, U: Clone> { One(T), Two(U) } | 274 | //- minicore: from |
275 | enum Generic<T, U: Clone> { $0One(T), Two(U) } | ||
276 | "#, | ||
277 | r#" | ||
278 | enum Generic<T, U: Clone> { One(T), Two(U) } | ||
242 | 279 | ||
243 | impl<T, U: Clone> From<T> for Generic<T, U> { | 280 | impl<T, U: Clone> From<T> for Generic<T, U> { |
244 | fn from(v: T) -> Self { | 281 | fn from(v: T) -> Self { |
245 | Self::One(v) | 282 | Self::One(v) |
246 | } | 283 | } |
247 | }"#, | 284 | } |
285 | "#, | ||
248 | ); | 286 | ); |
249 | } | 287 | } |
250 | 288 | ||
@@ -252,14 +290,19 @@ impl<T, U: Clone> From<T> for Generic<T, U> { | |||
252 | fn test_add_from_impl_with_lifetime() { | 290 | fn test_add_from_impl_with_lifetime() { |
253 | check_assist( | 291 | check_assist( |
254 | generate_from_impl_for_enum, | 292 | generate_from_impl_for_enum, |
255 | "enum Generic<'a> { $0One(&'a i32) }", | 293 | r#" |
256 | r#"enum Generic<'a> { One(&'a i32) } | 294 | //- minicore: from |
295 | enum Generic<'a> { $0One(&'a i32) } | ||
296 | "#, | ||
297 | r#" | ||
298 | enum Generic<'a> { One(&'a i32) } | ||
257 | 299 | ||
258 | impl<'a> From<&'a i32> for Generic<'a> { | 300 | impl<'a> From<&'a i32> for Generic<'a> { |
259 | fn from(v: &'a i32) -> Self { | 301 | fn from(v: &'a i32) -> Self { |
260 | Self::One(v) | 302 | Self::One(v) |
261 | } | 303 | } |
262 | }"#, | 304 | } |
305 | "#, | ||
263 | ); | 306 | ); |
264 | } | 307 | } |
265 | } | 308 | } |