aboutsummaryrefslogtreecommitdiff
path: root/crates/ssr/src/tests.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ssr/src/tests.rs')
-rw-r--r--crates/ssr/src/tests.rs106
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]
1177fn 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]
1249fn 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}