diff options
Diffstat (limited to 'crates/ssr/src/tests.rs')
-rw-r--r-- | crates/ssr/src/tests.rs | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/crates/ssr/src/tests.rs b/crates/ssr/src/tests.rs index 65cd38753..0ad3512ba 100644 --- a/crates/ssr/src/tests.rs +++ b/crates/ssr/src/tests.rs | |||
@@ -1172,3 +1172,109 @@ fn match_trait_method_call() { | |||
1172 | assert_matches("Bar::foo($a, $b)", code, &["v1.foo(1)", "Bar::foo(&v1, 3)", "v1_ref.foo(5)"]); | 1172 | assert_matches("Bar::foo($a, $b)", code, &["v1.foo(1)", "Bar::foo(&v1, 3)", "v1_ref.foo(5)"]); |
1173 | assert_matches("Bar2::foo($a, $b)", code, &["v2.foo(2)", "Bar2::foo(&v2, 4)", "v2_ref.foo(6)"]); | 1173 | assert_matches("Bar2::foo($a, $b)", code, &["v2.foo(2)", "Bar2::foo(&v2, 4)", "v2_ref.foo(6)"]); |
1174 | } | 1174 | } |
1175 | |||
1176 | #[test] | ||
1177 | fn replace_autoref_autoderef_capture() { | ||
1178 | // Here we have several calls to `$a.foo()`. In the first case autoref is applied, in the | ||
1179 | // second, we already have a reference, so it isn't. When $a is used in a context where autoref | ||
1180 | // doesn't apply, we need to prefix it with `&`. Finally, we have some cases where autoderef | ||
1181 | // needs to be applied. | ||
1182 | let code = r#" | ||
1183 | struct Foo {} | ||
1184 | impl Foo { | ||
1185 | fn foo(&self) {} | ||
1186 | fn foo2(&self) {} | ||
1187 | } | ||
1188 | fn bar(_: &Foo) {} | ||
1189 | fn main() { | ||
1190 | let f = Foo {}; | ||
1191 | let fr = &f; | ||
1192 | let fr2 = &fr; | ||
1193 | let fr3 = &fr2; | ||
1194 | f.foo(); | ||
1195 | fr.foo(); | ||
1196 | fr2.foo(); | ||
1197 | fr3.foo(); | ||
1198 | } | ||
1199 | "#; | ||
1200 | assert_ssr_transform( | ||
1201 | "Foo::foo($a) ==>> bar($a)", | ||
1202 | code, | ||
1203 | expect![[r#" | ||
1204 | struct Foo {} | ||
1205 | impl Foo { | ||
1206 | fn foo(&self) {} | ||
1207 | fn foo2(&self) {} | ||
1208 | } | ||
1209 | fn bar(_: &Foo) {} | ||
1210 | fn main() { | ||
1211 | let f = Foo {}; | ||
1212 | let fr = &f; | ||
1213 | let fr2 = &fr; | ||
1214 | let fr3 = &fr2; | ||
1215 | bar(&f); | ||
1216 | bar(&*fr); | ||
1217 | bar(&**fr2); | ||
1218 | bar(&***fr3); | ||
1219 | } | ||
1220 | "#]], | ||
1221 | ); | ||
1222 | // If the placeholder is used as the receiver of another method call, then we don't need to | ||
1223 | // explicitly autoderef or autoref. | ||
1224 | assert_ssr_transform( | ||
1225 | "Foo::foo($a) ==>> $a.foo2()", | ||
1226 | code, | ||
1227 | expect![[r#" | ||
1228 | struct Foo {} | ||
1229 | impl Foo { | ||
1230 | fn foo(&self) {} | ||
1231 | fn foo2(&self) {} | ||
1232 | } | ||
1233 | fn bar(_: &Foo) {} | ||
1234 | fn main() { | ||
1235 | let f = Foo {}; | ||
1236 | let fr = &f; | ||
1237 | let fr2 = &fr; | ||
1238 | let fr3 = &fr2; | ||
1239 | f.foo2(); | ||
1240 | fr.foo2(); | ||
1241 | fr2.foo2(); | ||
1242 | fr3.foo2(); | ||
1243 | } | ||
1244 | "#]], | ||
1245 | ); | ||
1246 | } | ||
1247 | |||
1248 | #[test] | ||
1249 | fn replace_autoref_mut() { | ||
1250 | let code = r#" | ||
1251 | struct Foo {} | ||
1252 | impl Foo { | ||
1253 | fn foo(&mut self) {} | ||
1254 | } | ||
1255 | fn bar(_: &mut Foo) {} | ||
1256 | fn main() { | ||
1257 | let mut f = Foo {}; | ||
1258 | f.foo(); | ||
1259 | let fr = &mut f; | ||
1260 | fr.foo(); | ||
1261 | } | ||
1262 | "#; | ||
1263 | assert_ssr_transform( | ||
1264 | "Foo::foo($a) ==>> bar($a)", | ||
1265 | code, | ||
1266 | expect![[r#" | ||
1267 | struct Foo {} | ||
1268 | impl Foo { | ||
1269 | fn foo(&mut self) {} | ||
1270 | } | ||
1271 | fn bar(_: &mut Foo) {} | ||
1272 | fn main() { | ||
1273 | let mut f = Foo {}; | ||
1274 | bar(&mut f); | ||
1275 | let fr = &mut f; | ||
1276 | bar(&mut *fr); | ||
1277 | } | ||
1278 | "#]], | ||
1279 | ); | ||
1280 | } | ||