diff options
Diffstat (limited to 'crates/ra_ssr/src/tests.rs')
-rw-r--r-- | crates/ra_ssr/src/tests.rs | 61 |
1 files changed, 60 insertions, 1 deletions
diff --git a/crates/ra_ssr/src/tests.rs b/crates/ra_ssr/src/tests.rs index 3ee1e74e9..7a3141be8 100644 --- a/crates/ra_ssr/src/tests.rs +++ b/crates/ra_ssr/src/tests.rs | |||
@@ -209,6 +209,11 @@ fn assert_ssr_transform(rule: &str, input: &str, result: &str) { | |||
209 | assert_ssr_transforms(&[rule], input, result); | 209 | assert_ssr_transforms(&[rule], input, result); |
210 | } | 210 | } |
211 | 211 | ||
212 | fn normalize_code(code: &str) -> String { | ||
213 | let (db, file_id) = single_file(code); | ||
214 | db.file_text(file_id).to_string() | ||
215 | } | ||
216 | |||
212 | fn assert_ssr_transforms(rules: &[&str], input: &str, result: &str) { | 217 | fn assert_ssr_transforms(rules: &[&str], input: &str, result: &str) { |
213 | let (db, file_id) = single_file(input); | 218 | let (db, file_id) = single_file(input); |
214 | let mut match_finder = MatchFinder::new(&db); | 219 | let mut match_finder = MatchFinder::new(&db); |
@@ -217,8 +222,13 @@ fn assert_ssr_transforms(rules: &[&str], input: &str, result: &str) { | |||
217 | match_finder.add_rule(rule); | 222 | match_finder.add_rule(rule); |
218 | } | 223 | } |
219 | if let Some(edits) = match_finder.edits_for_file(file_id) { | 224 | if let Some(edits) = match_finder.edits_for_file(file_id) { |
220 | let mut after = input.to_string(); | 225 | // Note, db.file_text is not necessarily the same as `input`, since fixture parsing alters |
226 | // stuff. | ||
227 | let mut after = db.file_text(file_id).to_string(); | ||
221 | edits.apply(&mut after); | 228 | edits.apply(&mut after); |
229 | // Likewise, we need to make sure that whatever transformations fixture parsing applies, | ||
230 | // also get appplied to our expected result. | ||
231 | let result = normalize_code(result); | ||
222 | assert_eq!(after, result); | 232 | assert_eq!(after, result); |
223 | } else { | 233 | } else { |
224 | panic!("No edits were made"); | 234 | panic!("No edits were made"); |
@@ -355,6 +365,18 @@ fn match_nested_method_calls() { | |||
355 | ); | 365 | ); |
356 | } | 366 | } |
357 | 367 | ||
368 | // Make sure that our node matching semantics don't differ within macro calls. | ||
369 | #[test] | ||
370 | fn match_nested_method_calls_with_macro_call() { | ||
371 | assert_matches( | ||
372 | "$a.z().z().z()", | ||
373 | r#" | ||
374 | macro_rules! m1 { ($a:expr) => {$a}; } | ||
375 | fn f() {m1!(h().i().j().z().z().z().d().e())}"#, | ||
376 | &["h().i().j().z().z().z()"], | ||
377 | ); | ||
378 | } | ||
379 | |||
358 | #[test] | 380 | #[test] |
359 | fn match_complex_expr() { | 381 | fn match_complex_expr() { |
360 | let code = "fn f() -> i32 {foo(bar(40, 2), 42)}"; | 382 | let code = "fn f() -> i32 {foo(bar(40, 2), 42)}"; |
@@ -547,3 +569,40 @@ fn multiple_rules() { | |||
547 | "fn f() -> i32 {add_one(add(3, 2))}", | 569 | "fn f() -> i32 {add_one(add(3, 2))}", |
548 | ) | 570 | ) |
549 | } | 571 | } |
572 | |||
573 | #[test] | ||
574 | fn match_within_macro_invocation() { | ||
575 | let code = r#" | ||
576 | macro_rules! foo { | ||
577 | ($a:stmt; $b:expr) => { | ||
578 | $b | ||
579 | }; | ||
580 | } | ||
581 | struct A {} | ||
582 | impl A { | ||
583 | fn bar() {} | ||
584 | } | ||
585 | fn f1() { | ||
586 | let aaa = A {}; | ||
587 | foo!(macro_ignores_this(); aaa.bar()); | ||
588 | } | ||
589 | "#; | ||
590 | assert_matches("$a.bar()", code, &["aaa.bar()"]); | ||
591 | } | ||
592 | |||
593 | #[test] | ||
594 | fn replace_within_macro_expansion() { | ||
595 | assert_ssr_transform( | ||
596 | "$a.foo() ==>> bar($a)", | ||
597 | r#" | ||
598 | macro_rules! macro1 { | ||
599 | ($a:expr) => {$a} | ||
600 | } | ||
601 | fn f() {macro1!(5.x().foo().o2())}"#, | ||
602 | r#" | ||
603 | macro_rules! macro1 { | ||
604 | ($a:expr) => {$a} | ||
605 | } | ||
606 | fn f() {macro1!(bar(5.x()).o2())}"#, | ||
607 | ) | ||
608 | } | ||