diff options
-rw-r--r-- | crates/ide/src/inlay_hints.rs | 31 | ||||
-rw-r--r-- | crates/ide_assists/src/handlers/replace_for_loop_with_for_each.rs | 78 | ||||
-rw-r--r-- | crates/test_utils/src/fixture.rs | 2 | ||||
-rw-r--r-- | crates/test_utils/src/minicore.rs | 39 |
4 files changed, 80 insertions, 70 deletions
diff --git a/crates/ide/src/inlay_hints.rs b/crates/ide/src/inlay_hints.rs index 9cd33d0e4..335d57a0d 100644 --- a/crates/ide/src/inlay_hints.rs +++ b/crates/ide/src/inlay_hints.rs | |||
@@ -434,7 +434,6 @@ fn get_callable( | |||
434 | #[cfg(test)] | 434 | #[cfg(test)] |
435 | mod tests { | 435 | mod tests { |
436 | use expect_test::{expect, Expect}; | 436 | use expect_test::{expect, Expect}; |
437 | use ide_db::helpers::FamousDefs; | ||
438 | use test_utils::extract_annotations; | 437 | use test_utils::extract_annotations; |
439 | 438 | ||
440 | use crate::{fixture, inlay_hints::InlayHintsConfig}; | 439 | use crate::{fixture, inlay_hints::InlayHintsConfig}; |
@@ -487,8 +486,6 @@ mod tests { | |||
487 | } | 486 | } |
488 | 487 | ||
489 | fn check_with_config(config: InlayHintsConfig, ra_fixture: &str) { | 488 | fn check_with_config(config: InlayHintsConfig, ra_fixture: &str) { |
490 | let ra_fixture = | ||
491 | format!("//- /main.rs crate:main deps:core\n{}\n{}", ra_fixture, FamousDefs::FIXTURE); | ||
492 | let (analysis, file_id) = fixture::file(&ra_fixture); | 489 | let (analysis, file_id) = fixture::file(&ra_fixture); |
493 | let expected = extract_annotations(&*analysis.file_text(file_id).unwrap()); | 490 | let expected = extract_annotations(&*analysis.file_text(file_id).unwrap()); |
494 | let inlay_hints = analysis.inlay_hints(file_id, &config).unwrap(); | 491 | let inlay_hints = analysis.inlay_hints(file_id, &config).unwrap(); |
@@ -498,8 +495,6 @@ mod tests { | |||
498 | } | 495 | } |
499 | 496 | ||
500 | fn check_expect(config: InlayHintsConfig, ra_fixture: &str, expect: Expect) { | 497 | fn check_expect(config: InlayHintsConfig, ra_fixture: &str, expect: Expect) { |
501 | let ra_fixture = | ||
502 | format!("//- /main.rs crate:main deps:core\n{}\n{}", ra_fixture, FamousDefs::FIXTURE); | ||
503 | let (analysis, file_id) = fixture::file(&ra_fixture); | 498 | let (analysis, file_id) = fixture::file(&ra_fixture); |
504 | let inlay_hints = analysis.inlay_hints(file_id, &config).unwrap(); | 499 | let inlay_hints = analysis.inlay_hints(file_id, &config).unwrap(); |
505 | expect.assert_debug_eq(&inlay_hints) | 500 | expect.assert_debug_eq(&inlay_hints) |
@@ -823,6 +818,7 @@ fn main() { | |||
823 | fn shorten_iterators_in_associated_params() { | 818 | fn shorten_iterators_in_associated_params() { |
824 | check_types( | 819 | check_types( |
825 | r#" | 820 | r#" |
821 | //- minicore: iterators | ||
826 | use core::iter; | 822 | use core::iter; |
827 | 823 | ||
828 | pub struct SomeIter<T> {} | 824 | pub struct SomeIter<T> {} |
@@ -875,7 +871,7 @@ fn main() { | |||
875 | fn fn_hints() { | 871 | fn fn_hints() { |
876 | check_types( | 872 | check_types( |
877 | r#" | 873 | r#" |
878 | trait Sized {} | 874 | //- minicore: fn, sized |
879 | 875 | ||
880 | fn foo() -> impl Fn() { loop {} } | 876 | fn foo() -> impl Fn() { loop {} } |
881 | fn foo1() -> impl Fn(f64) { loop {} } | 877 | fn foo1() -> impl Fn(f64) { loop {} } |
@@ -1073,6 +1069,7 @@ fn main() { | |||
1073 | fn complete_for_hint() { | 1069 | fn complete_for_hint() { |
1074 | check_types( | 1070 | check_types( |
1075 | r#" | 1071 | r#" |
1072 | //- minicore: iterator | ||
1076 | pub struct Vec<T> {} | 1073 | pub struct Vec<T> {} |
1077 | 1074 | ||
1078 | impl<T> Vec<T> { | 1075 | impl<T> Vec<T> { |
@@ -1129,6 +1126,7 @@ fn main() { | |||
1129 | fn shorten_iterator_hints() { | 1126 | fn shorten_iterator_hints() { |
1130 | check_types( | 1127 | check_types( |
1131 | r#" | 1128 | r#" |
1129 | //- minicore: iterators | ||
1132 | use core::iter; | 1130 | use core::iter; |
1133 | 1131 | ||
1134 | struct MyIter; | 1132 | struct MyIter; |
@@ -1230,12 +1228,12 @@ fn main() { | |||
1230 | expect![[r#" | 1228 | expect![[r#" |
1231 | [ | 1229 | [ |
1232 | InlayHint { | 1230 | InlayHint { |
1233 | range: 148..173, | 1231 | range: 147..172, |
1234 | kind: ChainingHint, | 1232 | kind: ChainingHint, |
1235 | label: "B", | 1233 | label: "B", |
1236 | }, | 1234 | }, |
1237 | InlayHint { | 1235 | InlayHint { |
1238 | range: 148..155, | 1236 | range: 147..154, |
1239 | kind: ChainingHint, | 1237 | kind: ChainingHint, |
1240 | label: "A", | 1238 | label: "A", |
1241 | }, | 1239 | }, |
@@ -1290,12 +1288,12 @@ fn main() { | |||
1290 | expect![[r#" | 1288 | expect![[r#" |
1291 | [ | 1289 | [ |
1292 | InlayHint { | 1290 | InlayHint { |
1293 | range: 144..191, | 1291 | range: 143..190, |
1294 | kind: ChainingHint, | 1292 | kind: ChainingHint, |
1295 | label: "C", | 1293 | label: "C", |
1296 | }, | 1294 | }, |
1297 | InlayHint { | 1295 | InlayHint { |
1298 | range: 144..180, | 1296 | range: 143..179, |
1299 | kind: ChainingHint, | 1297 | kind: ChainingHint, |
1300 | label: "B", | 1298 | label: "B", |
1301 | }, | 1299 | }, |
@@ -1335,12 +1333,12 @@ fn main() { | |||
1335 | expect![[r#" | 1333 | expect![[r#" |
1336 | [ | 1334 | [ |
1337 | InlayHint { | 1335 | InlayHint { |
1338 | range: 247..284, | 1336 | range: 246..283, |
1339 | kind: ChainingHint, | 1337 | kind: ChainingHint, |
1340 | label: "B<X<i32, bool>>", | 1338 | label: "B<X<i32, bool>>", |
1341 | }, | 1339 | }, |
1342 | InlayHint { | 1340 | InlayHint { |
1343 | range: 247..266, | 1341 | range: 246..265, |
1344 | kind: ChainingHint, | 1342 | kind: ChainingHint, |
1345 | label: "A<X<i32, bool>>", | 1343 | label: "A<X<i32, bool>>", |
1346 | }, | 1344 | }, |
@@ -1359,6 +1357,7 @@ fn main() { | |||
1359 | max_length: None, | 1357 | max_length: None, |
1360 | }, | 1358 | }, |
1361 | r#" | 1359 | r#" |
1360 | //- minicore: iterators | ||
1362 | use core::iter; | 1361 | use core::iter; |
1363 | 1362 | ||
1364 | struct MyIter; | 1363 | struct MyIter; |
@@ -1381,22 +1380,22 @@ fn main() { | |||
1381 | expect![[r#" | 1380 | expect![[r#" |
1382 | [ | 1381 | [ |
1383 | InlayHint { | 1382 | InlayHint { |
1384 | range: 175..242, | 1383 | range: 174..241, |
1385 | kind: ChainingHint, | 1384 | kind: ChainingHint, |
1386 | label: "impl Iterator<Item = ()>", | 1385 | label: "impl Iterator<Item = ()>", |
1387 | }, | 1386 | }, |
1388 | InlayHint { | 1387 | InlayHint { |
1389 | range: 175..225, | 1388 | range: 174..224, |
1390 | kind: ChainingHint, | 1389 | kind: ChainingHint, |
1391 | label: "impl Iterator<Item = ()>", | 1390 | label: "impl Iterator<Item = ()>", |
1392 | }, | 1391 | }, |
1393 | InlayHint { | 1392 | InlayHint { |
1394 | range: 175..207, | 1393 | range: 174..206, |
1395 | kind: ChainingHint, | 1394 | kind: ChainingHint, |
1396 | label: "impl Iterator<Item = ()>", | 1395 | label: "impl Iterator<Item = ()>", |
1397 | }, | 1396 | }, |
1398 | InlayHint { | 1397 | InlayHint { |
1399 | range: 175..190, | 1398 | range: 174..189, |
1400 | kind: ChainingHint, | 1399 | kind: ChainingHint, |
1401 | label: "&mut MyIter", | 1400 | label: "&mut MyIter", |
1402 | }, | 1401 | }, |
diff --git a/crates/ide_assists/src/handlers/replace_for_loop_with_for_each.rs b/crates/ide_assists/src/handlers/replace_for_loop_with_for_each.rs index 8e571723d..5f2aa016f 100644 --- a/crates/ide_assists/src/handlers/replace_for_loop_with_for_each.rs +++ b/crates/ide_assists/src/handlers/replace_for_loop_with_for_each.rs | |||
@@ -186,18 +186,14 @@ fn main() { | |||
186 | fn test_for_borrowed() { | 186 | fn test_for_borrowed() { |
187 | check_assist( | 187 | check_assist( |
188 | replace_for_loop_with_for_each, | 188 | replace_for_loop_with_for_each, |
189 | r" | 189 | r#" |
190 | //- minicore: iterator | 190 | //- minicore: iterators |
191 | struct Iter; | 191 | use core::iter::{Repeat, repeat}; |
192 | impl Iterator for Iter { | ||
193 | type Item = usize; | ||
194 | fn next(&mut self) -> Option<Self::Item> { None } | ||
195 | } | ||
196 | 192 | ||
197 | struct S; | 193 | struct S; |
198 | impl S { | 194 | impl S { |
199 | fn iter(&self) -> Iter { Iter } | 195 | fn iter(&self) -> Repeat<i32> { repeat(92) } |
200 | fn iter_mut(&mut self) -> Iter { Iter } | 196 | fn iter_mut(&mut self) -> Repeat<i32> { repeat(92) } |
201 | } | 197 | } |
202 | 198 | ||
203 | fn main() { | 199 | fn main() { |
@@ -206,18 +202,14 @@ fn main() { | |||
206 | let a = v * 2; | 202 | let a = v * 2; |
207 | } | 203 | } |
208 | } | 204 | } |
209 | ", | 205 | "#, |
210 | r" | 206 | r#" |
211 | struct Iter; | 207 | use core::iter::{Repeat, repeat}; |
212 | impl Iterator for Iter { | ||
213 | type Item = usize; | ||
214 | fn next(&mut self) -> Option<Self::Item> { None } | ||
215 | } | ||
216 | 208 | ||
217 | struct S; | 209 | struct S; |
218 | impl S { | 210 | impl S { |
219 | fn iter(&self) -> Iter { Iter } | 211 | fn iter(&self) -> Repeat<i32> { repeat(92) } |
220 | fn iter_mut(&mut self) -> Iter { Iter } | 212 | fn iter_mut(&mut self) -> Repeat<i32> { repeat(92) } |
221 | } | 213 | } |
222 | 214 | ||
223 | fn main() { | 215 | fn main() { |
@@ -226,7 +218,7 @@ fn main() { | |||
226 | let a = v * 2; | 218 | let a = v * 2; |
227 | }); | 219 | }); |
228 | } | 220 | } |
229 | ", | 221 | "#, |
230 | ) | 222 | ) |
231 | } | 223 | } |
232 | 224 | ||
@@ -259,18 +251,14 @@ fn main() { | |||
259 | fn test_for_borrowed_mut() { | 251 | fn test_for_borrowed_mut() { |
260 | check_assist( | 252 | check_assist( |
261 | replace_for_loop_with_for_each, | 253 | replace_for_loop_with_for_each, |
262 | r" | 254 | r#" |
263 | //- minicore: iterator | 255 | //- minicore: iterators |
264 | struct Iter; | 256 | use core::iter::{Repeat, repeat}; |
265 | impl Iterator for Iter { | ||
266 | type Item = usize; | ||
267 | fn next(&mut self) -> Option<Self::Item> { None } | ||
268 | } | ||
269 | 257 | ||
270 | struct S; | 258 | struct S; |
271 | impl S { | 259 | impl S { |
272 | fn iter(&self) -> Iter { Iter } | 260 | fn iter(&self) -> Repeat<i32> { repeat(92) } |
273 | fn iter_mut(&mut self) -> Iter { Iter } | 261 | fn iter_mut(&mut self) -> Repeat<i32> { repeat(92) } |
274 | } | 262 | } |
275 | 263 | ||
276 | fn main() { | 264 | fn main() { |
@@ -279,18 +267,14 @@ fn main() { | |||
279 | let a = v * 2; | 267 | let a = v * 2; |
280 | } | 268 | } |
281 | } | 269 | } |
282 | ", | 270 | "#, |
283 | r" | 271 | r#" |
284 | struct Iter; | 272 | use core::iter::{Repeat, repeat}; |
285 | impl Iterator for Iter { | ||
286 | type Item = usize; | ||
287 | fn next(&mut self) -> Option<Self::Item> { None } | ||
288 | } | ||
289 | 273 | ||
290 | struct S; | 274 | struct S; |
291 | impl S { | 275 | impl S { |
292 | fn iter(&self) -> Iter { Iter } | 276 | fn iter(&self) -> Repeat<i32> { repeat(92) } |
293 | fn iter_mut(&mut self) -> Iter { Iter } | 277 | fn iter_mut(&mut self) -> Repeat<i32> { repeat(92) } |
294 | } | 278 | } |
295 | 279 | ||
296 | fn main() { | 280 | fn main() { |
@@ -299,7 +283,7 @@ fn main() { | |||
299 | let a = v * 2; | 283 | let a = v * 2; |
300 | }); | 284 | }); |
301 | } | 285 | } |
302 | ", | 286 | "#, |
303 | ) | 287 | ) |
304 | } | 288 | } |
305 | 289 | ||
@@ -332,28 +316,16 @@ fn main() { | |||
332 | check_assist( | 316 | check_assist( |
333 | replace_for_loop_with_for_each, | 317 | replace_for_loop_with_for_each, |
334 | r#" | 318 | r#" |
335 | //- minicore: iterator | 319 | //- minicore: iterators |
336 | struct Iter; | ||
337 | impl Iterator for Iter { | ||
338 | type Item = usize; | ||
339 | fn next(&mut self) -> Option<Self::Item> { None } | ||
340 | } | ||
341 | |||
342 | fn main() { | 320 | fn main() { |
343 | for$0 a in Iter.take(1) { | 321 | for$0 a in core::iter::repeat(92).take(1) { |
344 | println!("{}", a); | 322 | println!("{}", a); |
345 | } | 323 | } |
346 | } | 324 | } |
347 | "#, | 325 | "#, |
348 | r#" | 326 | r#" |
349 | struct Iter; | ||
350 | impl Iterator for Iter { | ||
351 | type Item = usize; | ||
352 | fn next(&mut self) -> Option<Self::Item> { None } | ||
353 | } | ||
354 | |||
355 | fn main() { | 327 | fn main() { |
356 | Iter.take(1).for_each(|a| { | 328 | core::iter::repeat(92).take(1).for_each(|a| { |
357 | println!("{}", a); | 329 | println!("{}", a); |
358 | }); | 330 | }); |
359 | } | 331 | } |
diff --git a/crates/test_utils/src/fixture.rs b/crates/test_utils/src/fixture.rs index 005a5c092..8d8f3b560 100644 --- a/crates/test_utils/src/fixture.rs +++ b/crates/test_utils/src/fixture.rs | |||
@@ -154,7 +154,7 @@ impl Fixture { | |||
154 | let components = meta.split_ascii_whitespace().collect::<Vec<_>>(); | 154 | let components = meta.split_ascii_whitespace().collect::<Vec<_>>(); |
155 | 155 | ||
156 | let path = components[0].to_string(); | 156 | let path = components[0].to_string(); |
157 | assert!(path.starts_with('/')); | 157 | assert!(path.starts_with('/'), "fixture path does not start with `/`: {:?}", path); |
158 | 158 | ||
159 | let mut krate = None; | 159 | let mut krate = None; |
160 | let mut deps = Vec::new(); | 160 | let mut deps = Vec::new(); |
diff --git a/crates/test_utils/src/minicore.rs b/crates/test_utils/src/minicore.rs index 2f0da7fe5..e6d2301c7 100644 --- a/crates/test_utils/src/minicore.rs +++ b/crates/test_utils/src/minicore.rs | |||
@@ -21,6 +21,7 @@ | |||
21 | //! option: | 21 | //! option: |
22 | //! result: | 22 | //! result: |
23 | //! iterator: option | 23 | //! iterator: option |
24 | //! iterators: iterator | ||
24 | 25 | ||
25 | pub mod marker { | 26 | pub mod marker { |
26 | // region:sized | 27 | // region:sized |
@@ -209,6 +210,7 @@ pub mod task { | |||
209 | 210 | ||
210 | // region:iterator | 211 | // region:iterator |
211 | pub mod iter { | 212 | pub mod iter { |
213 | // region:iterators | ||
212 | mod adapters { | 214 | mod adapters { |
213 | pub struct Take<I> { | 215 | pub struct Take<I> { |
214 | iter: I, | 216 | iter: I, |
@@ -228,6 +230,29 @@ pub mod iter { | |||
228 | } | 230 | } |
229 | pub use self::adapters::Take; | 231 | pub use self::adapters::Take; |
230 | 232 | ||
233 | mod sources { | ||
234 | mod repeat { | ||
235 | pub fn repeat<T>(elt: T) -> Repeat<T> { | ||
236 | loop {} | ||
237 | } | ||
238 | |||
239 | pub struct Repeat<A> { | ||
240 | element: A, | ||
241 | } | ||
242 | |||
243 | impl<A> Iterator for Repeat<A> { | ||
244 | type Item = A; | ||
245 | |||
246 | fn next(&mut self) -> Option<A> { | ||
247 | loop {} | ||
248 | } | ||
249 | } | ||
250 | } | ||
251 | pub use self::repeat::{repeat, Repeat}; | ||
252 | } | ||
253 | pub use self::sources::{repeat, Repeat}; | ||
254 | // endregion:iterators | ||
255 | |||
231 | mod traits { | 256 | mod traits { |
232 | mod iterator { | 257 | mod iterator { |
233 | use super::super::Take; | 258 | use super::super::Take; |
@@ -239,9 +264,23 @@ pub mod iter { | |||
239 | fn nth(&mut self, n: usize) -> Option<Self::Item> { | 264 | fn nth(&mut self, n: usize) -> Option<Self::Item> { |
240 | loop {} | 265 | loop {} |
241 | } | 266 | } |
267 | fn by_ref(&mut self) -> &mut Self | ||
268 | where | ||
269 | Self: Sized, | ||
270 | { | ||
271 | self | ||
272 | } | ||
273 | // region:iterators | ||
242 | fn take(self, n: usize) -> crate::iter::Take<Self> { | 274 | fn take(self, n: usize) -> crate::iter::Take<Self> { |
243 | loop {} | 275 | loop {} |
244 | } | 276 | } |
277 | // endregion:iterators | ||
278 | } | ||
279 | impl<I: Iterator + ?Sized> Iterator for &mut I { | ||
280 | type Item = I::Item; | ||
281 | fn next(&mut self) -> Option<I::Item> { | ||
282 | (**self).next() | ||
283 | } | ||
245 | } | 284 | } |
246 | } | 285 | } |
247 | pub use self::iterator::Iterator; | 286 | pub use self::iterator::Iterator; |