diff options
Diffstat (limited to 'crates/ra_assists')
-rw-r--r-- | crates/ra_assists/src/handlers/add_from_impl_for_enum.rs | 2 | ||||
-rw-r--r-- | crates/ra_assists/src/handlers/auto_import.rs | 92 | ||||
-rw-r--r-- | crates/ra_assists/src/handlers/extract_struct_from_enum_variant.rs | 2 | ||||
-rw-r--r-- | crates/ra_assists/src/handlers/fill_match_arms.rs | 6 | ||||
-rw-r--r-- | crates/ra_assists/src/handlers/fix_visibility.rs | 157 | ||||
-rw-r--r-- | crates/ra_assists/src/handlers/introduce_variable.rs | 77 | ||||
-rw-r--r-- | crates/ra_assists/src/handlers/merge_imports.rs | 12 | ||||
-rw-r--r-- | crates/ra_assists/src/handlers/raw_string.rs | 48 | ||||
-rw-r--r-- | crates/ra_assists/src/handlers/split_import.rs | 10 | ||||
-rw-r--r-- | crates/ra_assists/src/tests.rs | 43 | ||||
-rw-r--r-- | crates/ra_assists/src/utils.rs | 3 |
11 files changed, 252 insertions, 200 deletions
diff --git a/crates/ra_assists/src/handlers/add_from_impl_for_enum.rs b/crates/ra_assists/src/handlers/add_from_impl_for_enum.rs index 776bddf91..b0e56e1b5 100644 --- a/crates/ra_assists/src/handlers/add_from_impl_for_enum.rs +++ b/crates/ra_assists/src/handlers/add_from_impl_for_enum.rs | |||
@@ -128,7 +128,7 @@ impl From<foo::bar::baz::Boo> for A { | |||
128 | 128 | ||
129 | fn check_not_applicable(ra_fixture: &str) { | 129 | fn check_not_applicable(ra_fixture: &str) { |
130 | let fixture = | 130 | let fixture = |
131 | format!("//- main.rs crate:main deps:core\n{}\n{}", ra_fixture, FamousDefs::FIXTURE); | 131 | format!("//- /main.rs crate:main deps:core\n{}\n{}", ra_fixture, FamousDefs::FIXTURE); |
132 | check_assist_not_applicable(add_from_impl_for_enum, &fixture) | 132 | check_assist_not_applicable(add_from_impl_for_enum, &fixture) |
133 | } | 133 | } |
134 | 134 | ||
diff --git a/crates/ra_assists/src/handlers/auto_import.rs b/crates/ra_assists/src/handlers/auto_import.rs index 5092bf336..d1cafa7d9 100644 --- a/crates/ra_assists/src/handlers/auto_import.rs +++ b/crates/ra_assists/src/handlers/auto_import.rs | |||
@@ -488,16 +488,17 @@ mod tests { | |||
488 | check_assist( | 488 | check_assist( |
489 | auto_import, | 489 | auto_import, |
490 | r" | 490 | r" |
491 | //- /lib.rs crate:crate_with_macro | 491 | //- /lib.rs crate:crate_with_macro |
492 | #[macro_export] | 492 | #[macro_export] |
493 | macro_rules! foo { | 493 | macro_rules! foo { |
494 | () => () | 494 | () => () |
495 | } | 495 | } |
496 | 496 | ||
497 | //- /main.rs crate:main deps:crate_with_macro | 497 | //- /main.rs crate:main deps:crate_with_macro |
498 | fn main() { | 498 | fn main() { |
499 | foo<|> | 499 | foo<|> |
500 | }", | 500 | } |
501 | ", | ||
501 | r"use crate_with_macro::foo; | 502 | r"use crate_with_macro::foo; |
502 | 503 | ||
503 | fn main() { | 504 | fn main() { |
@@ -847,13 +848,14 @@ fn main() { | |||
847 | check_assist( | 848 | check_assist( |
848 | auto_import, | 849 | auto_import, |
849 | r" | 850 | r" |
850 | //- /lib.rs crate:dep | 851 | //- /lib.rs crate:dep |
851 | pub struct Struct; | 852 | pub struct Struct; |
852 | 853 | ||
853 | //- /main.rs crate:main deps:dep | 854 | //- /main.rs crate:main deps:dep |
854 | fn main() { | 855 | fn main() { |
855 | Struct<|> | 856 | Struct<|> |
856 | }", | 857 | } |
858 | ", | ||
857 | r"use dep::Struct; | 859 | r"use dep::Struct; |
858 | 860 | ||
859 | fn main() { | 861 | fn main() { |
@@ -869,20 +871,22 @@ fn main() { | |||
869 | check_assist( | 871 | check_assist( |
870 | auto_import, | 872 | auto_import, |
871 | r" | 873 | r" |
872 | //- /lib.rs crate:dep | 874 | //- /lib.rs crate:dep |
873 | pub mod fmt { | 875 | pub mod fmt { |
874 | pub trait Display {} | 876 | pub trait Display {} |
875 | } | 877 | } |
876 | 878 | ||
877 | pub fn panic_fmt() {} | 879 | pub fn panic_fmt() {} |
878 | 880 | ||
879 | //- /main.rs crate:main deps:dep | 881 | //- /main.rs crate:main deps:dep |
880 | struct S; | 882 | struct S; |
881 | 883 | ||
882 | impl f<|>mt::Display for S {}", | 884 | impl f<|>mt::Display for S {} |
885 | ", | ||
883 | r"use dep::fmt; | 886 | r"use dep::fmt; |
884 | 887 | ||
885 | struct S; | 888 | struct S; |
889 | |||
886 | impl fmt::Display for S {} | 890 | impl fmt::Display for S {} |
887 | ", | 891 | ", |
888 | ); | 892 | ); |
@@ -894,21 +898,20 @@ impl fmt::Display for S {} | |||
894 | check_assist( | 898 | check_assist( |
895 | auto_import, | 899 | auto_import, |
896 | r" | 900 | r" |
897 | //- /lib.rs crate:dep | 901 | //- /lib.rs crate:dep |
898 | 902 | macro_rules! mac { | |
899 | macro_rules! mac { | 903 | () => { |
900 | () => { | 904 | pub struct Cheese; |
901 | pub struct Cheese; | 905 | }; |
902 | }; | 906 | } |
903 | } | ||
904 | |||
905 | mac!(); | ||
906 | 907 | ||
907 | //- /main.rs crate:main deps:dep | 908 | mac!(); |
908 | 909 | ||
909 | fn main() { | 910 | //- /main.rs crate:main deps:dep |
910 | Cheese<|>; | 911 | fn main() { |
911 | }", | 912 | Cheese<|>; |
913 | } | ||
914 | ", | ||
912 | r"use dep::Cheese; | 915 | r"use dep::Cheese; |
913 | 916 | ||
914 | fn main() { | 917 | fn main() { |
@@ -924,16 +927,15 @@ fn main() { | |||
924 | check_assist( | 927 | check_assist( |
925 | auto_import, | 928 | auto_import, |
926 | r" | 929 | r" |
927 | //- /lib.rs crate:dep | 930 | //- /lib.rs crate:dep |
928 | 931 | pub struct FMT; | |
929 | pub struct FMT; | 932 | pub struct fmt; |
930 | pub struct fmt; | ||
931 | |||
932 | //- /main.rs crate:main deps:dep | ||
933 | 933 | ||
934 | fn main() { | 934 | //- /main.rs crate:main deps:dep |
935 | FMT<|>; | 935 | fn main() { |
936 | }", | 936 | FMT<|>; |
937 | } | ||
938 | ", | ||
937 | r"use dep::FMT; | 939 | r"use dep::FMT; |
938 | 940 | ||
939 | fn main() { | 941 | fn main() { |
diff --git a/crates/ra_assists/src/handlers/extract_struct_from_enum_variant.rs b/crates/ra_assists/src/handlers/extract_struct_from_enum_variant.rs index 44db7917a..43b4584b4 100644 --- a/crates/ra_assists/src/handlers/extract_struct_from_enum_variant.rs +++ b/crates/ra_assists/src/handlers/extract_struct_from_enum_variant.rs | |||
@@ -301,7 +301,7 @@ fn another_fn() { | |||
301 | 301 | ||
302 | fn check_not_applicable(ra_fixture: &str) { | 302 | fn check_not_applicable(ra_fixture: &str) { |
303 | let fixture = | 303 | let fixture = |
304 | format!("//- main.rs crate:main deps:core\n{}\n{}", ra_fixture, FamousDefs::FIXTURE); | 304 | format!("//- /main.rs crate:main deps:core\n{}\n{}", ra_fixture, FamousDefs::FIXTURE); |
305 | check_assist_not_applicable(extract_struct_from_enum_variant, &fixture) | 305 | check_assist_not_applicable(extract_struct_from_enum_variant, &fixture) |
306 | } | 306 | } |
307 | 307 | ||
diff --git a/crates/ra_assists/src/handlers/fill_match_arms.rs b/crates/ra_assists/src/handlers/fill_match_arms.rs index 569efb768..64270c86f 100644 --- a/crates/ra_assists/src/handlers/fill_match_arms.rs +++ b/crates/ra_assists/src/handlers/fill_match_arms.rs | |||
@@ -763,9 +763,9 @@ mod tests { | |||
763 | fn foo(opt: Option<i32>) { | 763 | fn foo(opt: Option<i32>) { |
764 | match opt<|> { | 764 | match opt<|> { |
765 | } | 765 | } |
766 | }"#; | 766 | } |
767 | let before = | 767 | "#; |
768 | &format!("//- main.rs crate:main deps:core\n{}{}", before, FamousDefs::FIXTURE); | 768 | let before = &format!("//- /main.rs crate:main deps:core{}{}", before, FamousDefs::FIXTURE); |
769 | 769 | ||
770 | check_assist( | 770 | check_assist( |
771 | fill_match_arms, | 771 | fill_match_arms, |
diff --git a/crates/ra_assists/src/handlers/fix_visibility.rs b/crates/ra_assists/src/handlers/fix_visibility.rs index 531b3560f..54601d1f3 100644 --- a/crates/ra_assists/src/handlers/fix_visibility.rs +++ b/crates/ra_assists/src/handlers/fix_visibility.rs | |||
@@ -255,15 +255,14 @@ mod tests { | |||
255 | check_assist( | 255 | check_assist( |
256 | fix_visibility, | 256 | fix_visibility, |
257 | r" | 257 | r" |
258 | //- /main.rs | 258 | //- /main.rs |
259 | mod foo; | 259 | mod foo; |
260 | fn main() { foo::Foo<|> } | 260 | fn main() { foo::Foo<|> } |
261 | 261 | ||
262 | //- /foo.rs | 262 | //- /foo.rs |
263 | struct Foo; | 263 | struct Foo; |
264 | ", | 264 | ", |
265 | r"$0pub(crate) struct Foo; | 265 | r"$0pub(crate) struct Foo; |
266 | |||
267 | ", | 266 | ", |
268 | ); | 267 | ); |
269 | } | 268 | } |
@@ -279,14 +278,14 @@ mod tests { | |||
279 | ); | 278 | ); |
280 | check_assist( | 279 | check_assist( |
281 | fix_visibility, | 280 | fix_visibility, |
282 | r"//- /lib.rs | 281 | r" |
283 | mod foo; | 282 | //- /lib.rs |
284 | fn main() { foo::Foo { <|>bar: () }; } | 283 | mod foo; |
285 | //- /foo.rs | 284 | fn main() { foo::Foo { <|>bar: () }; } |
286 | pub struct Foo { bar: () } | 285 | //- /foo.rs |
287 | ", | 286 | pub struct Foo { bar: () } |
287 | ", | ||
288 | r"pub struct Foo { $0pub(crate) bar: () } | 288 | r"pub struct Foo { $0pub(crate) bar: () } |
289 | |||
290 | ", | 289 | ", |
291 | ); | 290 | ); |
292 | check_assist_not_applicable( | 291 | check_assist_not_applicable( |
@@ -296,12 +295,13 @@ mod tests { | |||
296 | ); | 295 | ); |
297 | check_assist_not_applicable( | 296 | check_assist_not_applicable( |
298 | fix_visibility, | 297 | fix_visibility, |
299 | r"//- /lib.rs | 298 | r" |
300 | mod foo; | 299 | //- /lib.rs |
301 | fn main() { foo::Foo { <|>bar: () }; } | 300 | mod foo; |
302 | //- /foo.rs | 301 | fn main() { foo::Foo { <|>bar: () }; } |
303 | pub struct Foo { pub bar: () } | 302 | //- /foo.rs |
304 | ", | 303 | pub struct Foo { pub bar: () } |
304 | ", | ||
305 | ); | 305 | ); |
306 | } | 306 | } |
307 | 307 | ||
@@ -316,14 +316,14 @@ mod tests { | |||
316 | ); | 316 | ); |
317 | check_assist( | 317 | check_assist( |
318 | fix_visibility, | 318 | fix_visibility, |
319 | r"//- /lib.rs | 319 | r" |
320 | mod foo; | 320 | //- /lib.rs |
321 | fn main() { foo::Foo::Bar { <|>bar: () }; } | 321 | mod foo; |
322 | //- /foo.rs | 322 | fn main() { foo::Foo::Bar { <|>bar: () }; } |
323 | pub enum Foo { Bar { bar: () } } | 323 | //- /foo.rs |
324 | ", | 324 | pub enum Foo { Bar { bar: () } } |
325 | ", | ||
325 | r"pub enum Foo { Bar { $0pub(crate) bar: () } } | 326 | r"pub enum Foo { Bar { $0pub(crate) bar: () } } |
326 | |||
327 | ", | 327 | ", |
328 | ); | 328 | ); |
329 | check_assist_not_applicable( | 329 | check_assist_not_applicable( |
@@ -333,12 +333,13 @@ mod tests { | |||
333 | ); | 333 | ); |
334 | check_assist_not_applicable( | 334 | check_assist_not_applicable( |
335 | fix_visibility, | 335 | fix_visibility, |
336 | r"//- /lib.rs | 336 | r" |
337 | mod foo; | 337 | //- /lib.rs |
338 | fn main() { foo::Foo { <|>bar: () }; } | 338 | mod foo; |
339 | //- /foo.rs | 339 | fn main() { foo::Foo { <|>bar: () }; } |
340 | pub struct Foo { pub bar: () } | 340 | //- /foo.rs |
341 | ", | 341 | pub struct Foo { pub bar: () } |
342 | ", | ||
342 | ); | 343 | ); |
343 | } | 344 | } |
344 | 345 | ||
@@ -355,14 +356,14 @@ mod tests { | |||
355 | ); | 356 | ); |
356 | check_assist( | 357 | check_assist( |
357 | fix_visibility, | 358 | fix_visibility, |
358 | r"//- /lib.rs | 359 | r" |
359 | mod foo; | 360 | //- /lib.rs |
360 | fn main() { foo::Foo { <|>bar: () }; } | 361 | mod foo; |
361 | //- /foo.rs | 362 | fn main() { foo::Foo { <|>bar: () }; } |
362 | pub union Foo { bar: () } | 363 | //- /foo.rs |
363 | ", | 364 | pub union Foo { bar: () } |
365 | ", | ||
364 | r"pub union Foo { $0pub(crate) bar: () } | 366 | r"pub union Foo { $0pub(crate) bar: () } |
365 | |||
366 | ", | 367 | ", |
367 | ); | 368 | ); |
368 | check_assist_not_applicable( | 369 | check_assist_not_applicable( |
@@ -372,12 +373,13 @@ mod tests { | |||
372 | ); | 373 | ); |
373 | check_assist_not_applicable( | 374 | check_assist_not_applicable( |
374 | fix_visibility, | 375 | fix_visibility, |
375 | r"//- /lib.rs | 376 | r" |
376 | mod foo; | 377 | //- /lib.rs |
377 | fn main() { foo::Foo { <|>bar: () }; } | 378 | mod foo; |
378 | //- /foo.rs | 379 | fn main() { foo::Foo { <|>bar: () }; } |
379 | pub union Foo { pub bar: () } | 380 | //- /foo.rs |
380 | ", | 381 | pub union Foo { pub bar: () } |
382 | ", | ||
381 | ); | 383 | ); |
382 | } | 384 | } |
383 | 385 | ||
@@ -458,19 +460,18 @@ mod tests { | |||
458 | check_assist( | 460 | check_assist( |
459 | fix_visibility, | 461 | fix_visibility, |
460 | r" | 462 | r" |
461 | //- /main.rs | 463 | //- /main.rs |
462 | mod foo; | 464 | mod foo; |
463 | fn main() { foo::bar<|>::baz(); } | 465 | fn main() { foo::bar<|>::baz(); } |
464 | 466 | ||
465 | //- /foo.rs | 467 | //- /foo.rs |
466 | mod bar { | 468 | mod bar { |
467 | pub fn baz() {} | 469 | pub fn baz() {} |
468 | } | 470 | } |
469 | ", | 471 | ", |
470 | r"$0pub(crate) mod bar { | 472 | r"$0pub(crate) mod bar { |
471 | pub fn baz() {} | 473 | pub fn baz() {} |
472 | } | 474 | } |
473 | |||
474 | ", | 475 | ", |
475 | ); | 476 | ); |
476 | 477 | ||
@@ -486,17 +487,15 @@ mod tests { | |||
486 | check_assist( | 487 | check_assist( |
487 | fix_visibility, | 488 | fix_visibility, |
488 | r" | 489 | r" |
489 | //- /main.rs | 490 | //- /main.rs |
490 | mod foo; | 491 | mod foo; |
491 | fn main() { foo::bar<|>::baz(); } | 492 | fn main() { foo::bar<|>::baz(); } |
492 | 493 | ||
493 | //- /foo.rs | 494 | //- /foo.rs |
494 | mod bar; | 495 | mod bar; |
495 | 496 | //- /foo/bar.rs | |
496 | //- /foo/bar.rs | 497 | pub fn baz() {} |
497 | pub fn baz() {} | 498 | ", |
498 | } | ||
499 | ", | ||
500 | r"$0pub(crate) mod bar; | 499 | r"$0pub(crate) mod bar; |
501 | ", | 500 | ", |
502 | ); | 501 | ); |
@@ -506,14 +505,16 @@ mod tests { | |||
506 | fn fix_visibility_of_module_declaration_in_other_file() { | 505 | fn fix_visibility_of_module_declaration_in_other_file() { |
507 | check_assist( | 506 | check_assist( |
508 | fix_visibility, | 507 | fix_visibility, |
509 | r"//- /main.rs | 508 | r" |
510 | mod foo; | 509 | //- /main.rs |
511 | fn main() { foo::bar<|>>::baz(); } | 510 | mod foo; |
511 | fn main() { foo::bar<|>>::baz(); } | ||
512 | 512 | ||
513 | //- /foo.rs | 513 | //- /foo.rs |
514 | mod bar { | 514 | mod bar { |
515 | pub fn baz() {} | 515 | pub fn baz() {} |
516 | }", | 516 | } |
517 | ", | ||
517 | r"$0pub(crate) mod bar { | 518 | r"$0pub(crate) mod bar { |
518 | pub fn baz() {} | 519 | pub fn baz() {} |
519 | } | 520 | } |
@@ -525,10 +526,12 @@ mod tests { | |||
525 | fn adds_pub_when_target_is_in_another_crate() { | 526 | fn adds_pub_when_target_is_in_another_crate() { |
526 | check_assist( | 527 | check_assist( |
527 | fix_visibility, | 528 | fix_visibility, |
528 | r"//- /main.rs crate:a deps:foo | 529 | r" |
529 | foo::Bar<|> | 530 | //- /main.rs crate:a deps:foo |
530 | //- /lib.rs crate:foo | 531 | foo::Bar<|> |
531 | struct Bar;", | 532 | //- /lib.rs crate:foo |
533 | struct Bar; | ||
534 | ", | ||
532 | r"$0pub struct Bar; | 535 | r"$0pub struct Bar; |
533 | ", | 536 | ", |
534 | ) | 537 | ) |
diff --git a/crates/ra_assists/src/handlers/introduce_variable.rs b/crates/ra_assists/src/handlers/introduce_variable.rs index 31d6539f7..96affe49d 100644 --- a/crates/ra_assists/src/handlers/introduce_variable.rs +++ b/crates/ra_assists/src/handlers/introduce_variable.rs | |||
@@ -44,12 +44,26 @@ pub(crate) fn introduce_variable(acc: &mut Assists, ctx: &AssistContext) -> Opti | |||
44 | } | 44 | } |
45 | let target = expr.syntax().text_range(); | 45 | let target = expr.syntax().text_range(); |
46 | acc.add(AssistId("introduce_variable"), "Extract into variable", target, move |edit| { | 46 | acc.add(AssistId("introduce_variable"), "Extract into variable", target, move |edit| { |
47 | let field_shorthand = match expr.syntax().parent().and_then(ast::RecordField::cast) { | ||
48 | Some(field) => field.name_ref(), | ||
49 | None => None, | ||
50 | }; | ||
51 | |||
47 | let mut buf = String::new(); | 52 | let mut buf = String::new(); |
48 | 53 | ||
54 | let var_name = match &field_shorthand { | ||
55 | Some(it) => it.to_string(), | ||
56 | None => "var_name".to_string(), | ||
57 | }; | ||
58 | let expr_range = match &field_shorthand { | ||
59 | Some(it) => it.syntax().text_range().cover(expr.syntax().text_range()), | ||
60 | None => expr.syntax().text_range(), | ||
61 | }; | ||
62 | |||
49 | if wrap_in_block { | 63 | if wrap_in_block { |
50 | buf.push_str("{ let var_name = "); | 64 | format_to!(buf, "{{ let {} = ", var_name); |
51 | } else { | 65 | } else { |
52 | buf.push_str("let var_name = "); | 66 | format_to!(buf, "let {} = ", var_name); |
53 | }; | 67 | }; |
54 | format_to!(buf, "{}", expr.syntax()); | 68 | format_to!(buf, "{}", expr.syntax()); |
55 | 69 | ||
@@ -64,13 +78,13 @@ pub(crate) fn introduce_variable(acc: &mut Assists, ctx: &AssistContext) -> Opti | |||
64 | if full_stmt.unwrap().semicolon_token().is_none() { | 78 | if full_stmt.unwrap().semicolon_token().is_none() { |
65 | buf.push_str(";"); | 79 | buf.push_str(";"); |
66 | } | 80 | } |
67 | let offset = expr.syntax().text_range(); | ||
68 | match ctx.config.snippet_cap { | 81 | match ctx.config.snippet_cap { |
69 | Some(cap) => { | 82 | Some(cap) => { |
70 | let snip = buf.replace("let var_name", "let $0var_name"); | 83 | let snip = |
71 | edit.replace_snippet(cap, offset, snip) | 84 | buf.replace(&format!("let {}", var_name), &format!("let $0{}", var_name)); |
85 | edit.replace_snippet(cap, expr_range, snip) | ||
72 | } | 86 | } |
73 | None => edit.replace(offset, buf), | 87 | None => edit.replace(expr_range, buf), |
74 | } | 88 | } |
75 | return; | 89 | return; |
76 | } | 90 | } |
@@ -88,11 +102,12 @@ pub(crate) fn introduce_variable(acc: &mut Assists, ctx: &AssistContext) -> Opti | |||
88 | buf.push_str(text); | 102 | buf.push_str(text); |
89 | } | 103 | } |
90 | 104 | ||
91 | edit.replace(expr.syntax().text_range(), "var_name".to_string()); | 105 | edit.replace(expr_range, var_name.clone()); |
92 | let offset = anchor_stmt.text_range().start(); | 106 | let offset = anchor_stmt.text_range().start(); |
93 | match ctx.config.snippet_cap { | 107 | match ctx.config.snippet_cap { |
94 | Some(cap) => { | 108 | Some(cap) => { |
95 | let snip = buf.replace("let var_name", "let $0var_name"); | 109 | let snip = |
110 | buf.replace(&format!("let {}", var_name), &format!("let $0{}", var_name)); | ||
96 | edit.insert_snippet(cap, offset, snip) | 111 | edit.insert_snippet(cap, offset, snip) |
97 | } | 112 | } |
98 | None => edit.insert(offset, buf), | 113 | None => edit.insert(offset, buf), |
@@ -226,27 +241,31 @@ fn foo() { | |||
226 | mark::check!(test_introduce_var_last_expr); | 241 | mark::check!(test_introduce_var_last_expr); |
227 | check_assist( | 242 | check_assist( |
228 | introduce_variable, | 243 | introduce_variable, |
229 | " | 244 | r#" |
230 | fn foo() { | 245 | fn foo() { |
231 | bar(<|>1 + 1<|>) | 246 | bar(<|>1 + 1<|>) |
232 | }", | 247 | } |
233 | " | 248 | "#, |
249 | r#" | ||
234 | fn foo() { | 250 | fn foo() { |
235 | let $0var_name = 1 + 1; | 251 | let $0var_name = 1 + 1; |
236 | bar(var_name) | 252 | bar(var_name) |
237 | }", | 253 | } |
254 | "#, | ||
238 | ); | 255 | ); |
239 | check_assist( | 256 | check_assist( |
240 | introduce_variable, | 257 | introduce_variable, |
241 | " | 258 | r#" |
242 | fn foo() { | 259 | fn foo() { |
243 | <|>bar(1 + 1)<|> | 260 | <|>bar(1 + 1)<|> |
244 | }", | 261 | } |
245 | " | 262 | "#, |
263 | r#" | ||
246 | fn foo() { | 264 | fn foo() { |
247 | let $0var_name = bar(1 + 1); | 265 | let $0var_name = bar(1 + 1); |
248 | var_name | 266 | var_name |
249 | }", | 267 | } |
268 | "#, | ||
250 | ) | 269 | ) |
251 | } | 270 | } |
252 | 271 | ||
@@ -500,6 +519,32 @@ fn main() { | |||
500 | } | 519 | } |
501 | 520 | ||
502 | #[test] | 521 | #[test] |
522 | fn introduce_var_field_shorthand() { | ||
523 | check_assist( | ||
524 | introduce_variable, | ||
525 | r#" | ||
526 | struct S { | ||
527 | foo: i32 | ||
528 | } | ||
529 | |||
530 | fn main() { | ||
531 | S { foo: <|>1 + 1<|> } | ||
532 | } | ||
533 | "#, | ||
534 | r#" | ||
535 | struct S { | ||
536 | foo: i32 | ||
537 | } | ||
538 | |||
539 | fn main() { | ||
540 | let $0foo = 1 + 1; | ||
541 | S { foo } | ||
542 | } | ||
543 | "#, | ||
544 | ) | ||
545 | } | ||
546 | |||
547 | #[test] | ||
503 | fn test_introduce_var_for_return_not_applicable() { | 548 | fn test_introduce_var_for_return_not_applicable() { |
504 | check_assist_not_applicable(introduce_variable, "fn foo() { <|>return<|>; } "); | 549 | check_assist_not_applicable(introduce_variable, "fn foo() { <|>return<|>; } "); |
505 | } | 550 | } |
diff --git a/crates/ra_assists/src/handlers/merge_imports.rs b/crates/ra_assists/src/handlers/merge_imports.rs index 972d16241..ac0b3035c 100644 --- a/crates/ra_assists/src/handlers/merge_imports.rs +++ b/crates/ra_assists/src/handlers/merge_imports.rs | |||
@@ -127,7 +127,7 @@ fn first_path(path: &ast::Path) -> ast::Path { | |||
127 | 127 | ||
128 | #[cfg(test)] | 128 | #[cfg(test)] |
129 | mod tests { | 129 | mod tests { |
130 | use crate::tests::check_assist; | 130 | use crate::tests::{check_assist, check_assist_not_applicable}; |
131 | 131 | ||
132 | use super::*; | 132 | use super::*; |
133 | 133 | ||
@@ -276,4 +276,14 @@ bar::baz}; | |||
276 | ", | 276 | ", |
277 | ) | 277 | ) |
278 | } | 278 | } |
279 | |||
280 | #[test] | ||
281 | fn test_empty_use() { | ||
282 | check_assist_not_applicable( | ||
283 | merge_imports, | ||
284 | r" | ||
285 | use std::<|> | ||
286 | fn main() {}", | ||
287 | ); | ||
288 | } | ||
279 | } | 289 | } |
diff --git a/crates/ra_assists/src/handlers/raw_string.rs b/crates/ra_assists/src/handlers/raw_string.rs index 16002d2ac..d22d0aa55 100644 --- a/crates/ra_assists/src/handlers/raw_string.rs +++ b/crates/ra_assists/src/handlers/raw_string.rs | |||
@@ -158,16 +158,16 @@ mod test { | |||
158 | check_assist( | 158 | check_assist( |
159 | make_raw_string, | 159 | make_raw_string, |
160 | r#" | 160 | r#" |
161 | fn f() { | 161 | fn f() { |
162 | let s = <|>"random\nstring"; | 162 | let s = <|>"random\nstring"; |
163 | } | 163 | } |
164 | "#, | 164 | "#, |
165 | r##" | 165 | r##" |
166 | fn f() { | 166 | fn f() { |
167 | let s = r#"random | 167 | let s = r#"random |
168 | string"#; | 168 | string"#; |
169 | } | 169 | } |
170 | "##, | 170 | "##, |
171 | ) | 171 | ) |
172 | } | 172 | } |
173 | 173 | ||
@@ -193,16 +193,16 @@ string"#; | |||
193 | check_assist( | 193 | check_assist( |
194 | make_raw_string, | 194 | make_raw_string, |
195 | r###" | 195 | r###" |
196 | fn f() { | 196 | fn f() { |
197 | let s = <|>"#random##\nstring"; | 197 | let s = <|>"#random##\nstring"; |
198 | } | 198 | } |
199 | "###, | 199 | "###, |
200 | r####" | 200 | r####" |
201 | fn f() { | 201 | fn f() { |
202 | let s = r#"#random## | 202 | let s = r#"#random## |
203 | string"#; | 203 | string"#; |
204 | } | 204 | } |
205 | "####, | 205 | "####, |
206 | ) | 206 | ) |
207 | } | 207 | } |
208 | 208 | ||
@@ -211,16 +211,16 @@ string"#; | |||
211 | check_assist( | 211 | check_assist( |
212 | make_raw_string, | 212 | make_raw_string, |
213 | r###" | 213 | r###" |
214 | fn f() { | 214 | fn f() { |
215 | let s = <|>"#random\"##\nstring"; | 215 | let s = <|>"#random\"##\nstring"; |
216 | } | 216 | } |
217 | "###, | 217 | "###, |
218 | r####" | 218 | r####" |
219 | fn f() { | 219 | fn f() { |
220 | let s = r###"#random"## | 220 | let s = r###"#random"## |
221 | string"###; | 221 | string"###; |
222 | } | 222 | } |
223 | "####, | 223 | "####, |
224 | ) | 224 | ) |
225 | } | 225 | } |
226 | 226 | ||
diff --git a/crates/ra_assists/src/handlers/split_import.rs b/crates/ra_assists/src/handlers/split_import.rs index c7a874480..38aa199a0 100644 --- a/crates/ra_assists/src/handlers/split_import.rs +++ b/crates/ra_assists/src/handlers/split_import.rs | |||
@@ -66,4 +66,14 @@ mod tests { | |||
66 | fn issue4044() { | 66 | fn issue4044() { |
67 | check_assist_not_applicable(split_import, "use crate::<|>:::self;") | 67 | check_assist_not_applicable(split_import, "use crate::<|>:::self;") |
68 | } | 68 | } |
69 | |||
70 | #[test] | ||
71 | fn test_empty_use() { | ||
72 | check_assist_not_applicable( | ||
73 | split_import, | ||
74 | r" | ||
75 | use std::<|> | ||
76 | fn main() {}", | ||
77 | ); | ||
78 | } | ||
69 | } | 79 | } |
diff --git a/crates/ra_assists/src/tests.rs b/crates/ra_assists/src/tests.rs index 62dd3547f..858f5ca80 100644 --- a/crates/ra_assists/src/tests.rs +++ b/crates/ra_assists/src/tests.rs | |||
@@ -1,27 +1,21 @@ | |||
1 | mod generated; | 1 | mod generated; |
2 | 2 | ||
3 | use std::sync::Arc; | ||
4 | |||
5 | use hir::Semantics; | 3 | use hir::Semantics; |
6 | use ra_db::{fixture::WithFixture, FileId, FileRange, SourceDatabaseExt}; | 4 | use ra_db::{fixture::WithFixture, FileId, FileRange, SourceDatabaseExt}; |
7 | use ra_ide_db::{symbol_index::SymbolsDatabase, RootDatabase}; | 5 | use ra_ide_db::RootDatabase; |
8 | use ra_syntax::TextRange; | 6 | use ra_syntax::TextRange; |
9 | use test_utils::{ | 7 | use test_utils::{assert_eq_text, extract_offset, extract_range}; |
10 | assert_eq_text, extract_offset, extract_range, extract_range_or_offset, RangeOrOffset, | ||
11 | }; | ||
12 | 8 | ||
13 | use crate::{handlers::Handler, Assist, AssistConfig, AssistContext, Assists}; | 9 | use crate::{handlers::Handler, Assist, AssistConfig, AssistContext, Assists}; |
10 | use stdx::trim_indent; | ||
14 | 11 | ||
15 | pub(crate) fn with_single_file(text: &str) -> (RootDatabase, FileId) { | 12 | pub(crate) fn with_single_file(text: &str) -> (RootDatabase, FileId) { |
16 | let (mut db, file_id) = RootDatabase::with_single_file(text); | 13 | RootDatabase::with_single_file(text) |
17 | // FIXME: ideally, this should be done by the above `RootDatabase::with_single_file`, | ||
18 | // but it looks like this might need specialization? :( | ||
19 | db.set_local_roots(Arc::new(vec![db.file_source_root(file_id)])); | ||
20 | (db, file_id) | ||
21 | } | 14 | } |
22 | 15 | ||
23 | pub(crate) fn check_assist(assist: Handler, ra_fixture_before: &str, ra_fixture_after: &str) { | 16 | pub(crate) fn check_assist(assist: Handler, ra_fixture_before: &str, ra_fixture_after: &str) { |
24 | check(assist, ra_fixture_before, ExpectedResult::After(ra_fixture_after)); | 17 | let ra_fixture_after = trim_indent(ra_fixture_after); |
18 | check(assist, ra_fixture_before, ExpectedResult::After(&ra_fixture_after)); | ||
25 | } | 19 | } |
26 | 20 | ||
27 | // FIXME: instead of having a separate function here, maybe use | 21 | // FIXME: instead of having a separate function here, maybe use |
@@ -36,8 +30,9 @@ pub(crate) fn check_assist_not_applicable(assist: Handler, ra_fixture: &str) { | |||
36 | } | 30 | } |
37 | 31 | ||
38 | fn check_doc_test(assist_id: &str, before: &str, after: &str) { | 32 | fn check_doc_test(assist_id: &str, before: &str, after: &str) { |
39 | let (selection, before) = extract_range_or_offset(before); | 33 | let after = trim_indent(after); |
40 | let (db, file_id) = crate::tests::with_single_file(&before); | 34 | let (db, file_id, selection) = RootDatabase::with_range_or_offset(&before); |
35 | let before = db.file_text(file_id).to_string(); | ||
41 | let frange = FileRange { file_id, range: selection.into() }; | 36 | let frange = FileRange { file_id, range: selection.into() }; |
42 | 37 | ||
43 | let mut assist = Assist::resolved(&db, &AssistConfig::default(), frange) | 38 | let mut assist = Assist::resolved(&db, &AssistConfig::default(), frange) |
@@ -57,11 +52,11 @@ fn check_doc_test(assist_id: &str, before: &str, after: &str) { | |||
57 | 52 | ||
58 | let actual = { | 53 | let actual = { |
59 | let change = assist.source_change.source_file_edits.pop().unwrap(); | 54 | let change = assist.source_change.source_file_edits.pop().unwrap(); |
60 | let mut actual = before.clone(); | 55 | let mut actual = before; |
61 | change.edit.apply(&mut actual); | 56 | change.edit.apply(&mut actual); |
62 | actual | 57 | actual |
63 | }; | 58 | }; |
64 | assert_eq_text!(after, &actual); | 59 | assert_eq_text!(&after, &actual); |
65 | } | 60 | } |
66 | 61 | ||
67 | enum ExpectedResult<'a> { | 62 | enum ExpectedResult<'a> { |
@@ -71,20 +66,8 @@ enum ExpectedResult<'a> { | |||
71 | } | 66 | } |
72 | 67 | ||
73 | fn check(handler: Handler, before: &str, expected: ExpectedResult) { | 68 | fn check(handler: Handler, before: &str, expected: ExpectedResult) { |
74 | let (text_without_caret, file_with_caret_id, range_or_offset, db) = if before.contains("//-") { | 69 | let (db, file_with_caret_id, range_or_offset) = RootDatabase::with_range_or_offset(before); |
75 | let (mut db, position) = RootDatabase::with_position(before); | 70 | let text_without_caret = db.file_text(file_with_caret_id).to_string(); |
76 | db.set_local_roots(Arc::new(vec![db.file_source_root(position.file_id)])); | ||
77 | ( | ||
78 | db.file_text(position.file_id).as_ref().to_owned(), | ||
79 | position.file_id, | ||
80 | RangeOrOffset::Offset(position.offset), | ||
81 | db, | ||
82 | ) | ||
83 | } else { | ||
84 | let (range_or_offset, text_without_caret) = extract_range_or_offset(before); | ||
85 | let (db, file_id) = with_single_file(&text_without_caret); | ||
86 | (text_without_caret, file_id, range_or_offset, db) | ||
87 | }; | ||
88 | 71 | ||
89 | let frange = FileRange { file_id: file_with_caret_id, range: range_or_offset.into() }; | 72 | let frange = FileRange { file_id: file_with_caret_id, range: range_or_offset.into() }; |
90 | 73 | ||
diff --git a/crates/ra_assists/src/utils.rs b/crates/ra_assists/src/utils.rs index c1ff0de7b..b7c45a619 100644 --- a/crates/ra_assists/src/utils.rs +++ b/crates/ra_assists/src/utils.rs | |||
@@ -198,8 +198,7 @@ pub(crate) struct FamousDefs<'a, 'b>(pub(crate) &'a Semantics<'b, RootDatabase>, | |||
198 | #[allow(non_snake_case)] | 198 | #[allow(non_snake_case)] |
199 | impl FamousDefs<'_, '_> { | 199 | impl FamousDefs<'_, '_> { |
200 | #[cfg(test)] | 200 | #[cfg(test)] |
201 | pub(crate) const FIXTURE: &'static str = r#" | 201 | pub(crate) const FIXTURE: &'static str = r#"//- /libcore.rs crate:core |
202 | //- /libcore.rs crate:core | ||
203 | pub mod convert { | 202 | pub mod convert { |
204 | pub trait From<T> { | 203 | pub trait From<T> { |
205 | fn from(T) -> Self; | 204 | fn from(T) -> Self; |