diff options
author | David Lattimore <[email protected]> | 2020-07-24 11:53:48 +0100 |
---|---|---|
committer | David Lattimore <[email protected]> | 2020-07-24 12:34:00 +0100 |
commit | 3dac31fe80b9d7279e87b94615b0d55805e83412 (patch) | |
tree | d172c092d9ca93c182b2d88c30c3086a9ea797b0 /crates/ra_ssr/src/tests.rs | |
parent | 8d09ab86edfc01405fd0045bef82e0642efd5f01 (diff) |
SSR: Allow function calls to match method calls
This differs from how this used to work before I removed it in that:
a) It's only one direction. Function calls in the pattern can match
method calls in the code, but not the other way around.
b) We now check that the function call in the pattern resolves to the
same function as the method call in the code.
The lack of (b) was the reason I felt the need to remove the feature
before.
Diffstat (limited to 'crates/ra_ssr/src/tests.rs')
-rw-r--r-- | crates/ra_ssr/src/tests.rs | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/crates/ra_ssr/src/tests.rs b/crates/ra_ssr/src/tests.rs index f564c6129..b38807c0f 100644 --- a/crates/ra_ssr/src/tests.rs +++ b/crates/ra_ssr/src/tests.rs | |||
@@ -827,3 +827,61 @@ fn use_declaration_with_braces() { | |||
827 | "]], | 827 | "]], |
828 | ) | 828 | ) |
829 | } | 829 | } |
830 | |||
831 | #[test] | ||
832 | fn ufcs_matches_method_call() { | ||
833 | let code = r#" | ||
834 | struct Foo {} | ||
835 | impl Foo { | ||
836 | fn new(_: i32) -> Foo { Foo {} } | ||
837 | fn do_stuff(&self, _: i32) {} | ||
838 | } | ||
839 | struct Bar {} | ||
840 | impl Bar { | ||
841 | fn new(_: i32) -> Bar { Bar {} } | ||
842 | fn do_stuff(&self, v: i32) {} | ||
843 | } | ||
844 | fn main() { | ||
845 | let b = Bar {}; | ||
846 | let f = Foo {}; | ||
847 | b.do_stuff(1); | ||
848 | f.do_stuff(2); | ||
849 | Foo::new(4).do_stuff(3); | ||
850 | // Too many / too few args - should never match | ||
851 | f.do_stuff(2, 10); | ||
852 | f.do_stuff(); | ||
853 | } | ||
854 | "#; | ||
855 | assert_matches("Foo::do_stuff($a, $b)", code, &["f.do_stuff(2)", "Foo::new(4).do_stuff(3)"]); | ||
856 | // The arguments needs special handling in the case of a function call matching a method call | ||
857 | // and the first argument is different. | ||
858 | assert_matches("Foo::do_stuff($a, 2)", code, &["f.do_stuff(2)"]); | ||
859 | assert_matches("Foo::do_stuff(Foo::new(4), $b)", code, &["Foo::new(4).do_stuff(3)"]); | ||
860 | |||
861 | assert_ssr_transform( | ||
862 | "Foo::do_stuff(Foo::new($a), $b) ==>> Bar::new($b).do_stuff($a)", | ||
863 | code, | ||
864 | expect![[r#" | ||
865 | struct Foo {} | ||
866 | impl Foo { | ||
867 | fn new(_: i32) -> Foo { Foo {} } | ||
868 | fn do_stuff(&self, _: i32) {} | ||
869 | } | ||
870 | struct Bar {} | ||
871 | impl Bar { | ||
872 | fn new(_: i32) -> Bar { Bar {} } | ||
873 | fn do_stuff(&self, v: i32) {} | ||
874 | } | ||
875 | fn main() { | ||
876 | let b = Bar {}; | ||
877 | let f = Foo {}; | ||
878 | b.do_stuff(1); | ||
879 | f.do_stuff(2); | ||
880 | Bar::new(3).do_stuff(4); | ||
881 | // Too many / too few args - should never match | ||
882 | f.do_stuff(2, 10); | ||
883 | f.do_stuff(); | ||
884 | } | ||
885 | "#]], | ||
886 | ); | ||
887 | } | ||