Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/rename.rs')
-rw-r--r--crates/ide/src/rename.rs81
1 files changed, 81 insertions, 0 deletions
diff --git a/crates/ide/src/rename.rs b/crates/ide/src/rename.rs
index 3e8295e3f0..d0e1c2097a 100644
--- a/crates/ide/src/rename.rs
+++ b/crates/ide/src/rename.rs
@@ -446,6 +446,7 @@ mod tests {
use expect_test::{expect, Expect};
use ide_db::source_change::SourceChange;
use ide_db::text_edit::TextEdit;
+ use itertools::Itertools;
use stdx::trim_indent;
use test_utils::assert_eq_text;
@@ -496,6 +497,31 @@ mod tests {
};
}
+ #[track_caller]
+ fn check_conflicts(new_name: &str, #[rust_analyzer::rust_fixture] ra_fixture: &str) {
+ let (analysis, position, conflicts) = fixture::annotations(ra_fixture);
+ let source_change = analysis.rename(position, new_name).unwrap().unwrap();
+ let expected_conflicts = conflicts
+ .into_iter()
+ .map(|(file_range, _)| (file_range.file_id, file_range.range))
+ .sorted_unstable_by_key(|(file_id, range)| (*file_id, range.start()))
+ .collect_vec();
+ let found_conflicts = source_change
+ .source_file_edits
+ .iter()
+ .flat_map(|(file_id, (edit, _))| {
+ edit.into_iter()
+ .filter(|edit| edit.annotation.is_some())
+ .map(move |edit| (*file_id, edit.delete))
+ })
+ .sorted_unstable_by_key(|(file_id, range)| (*file_id, range.start()))
+ .collect_vec();
+ assert_eq!(
+ expected_conflicts, found_conflicts,
+ "rename conflicts mismatch: {source_change:#?}"
+ );
+ }
+
fn check_expect(
new_name: &str,
#[rust_analyzer::rust_fixture] ra_fixture: &str,
@@ -548,6 +574,37 @@ mod tests {
}
#[test]
+ fn rename_will_shadow() {
+ check_conflicts(
+ "new_name",
+ r#"
+fn foo() {
+ let mut new_name = 123;
+ let old_name$0 = 456;
+ // ^^^^^^^^
+ new_name = 789 + new_name;
+}
+ "#,
+ );
+ }
+
+ #[test]
+ fn rename_will_be_shadowed() {
+ check_conflicts(
+ "new_name",
+ r#"
+fn foo() {
+ let mut old_name$0 = 456;
+ // ^^^^^^^^
+ let new_name = 123;
+ old_name = 789 + old_name;
+ // ^^^^^^^^ ^^^^^^^^
+}
+ "#,
+ );
+ }
+
+ #[test]
fn test_prepare_rename_namelikes() {
check_prepare(r"fn name$0<'lifetime>() {}", expect![[r#"3..7: name"#]]);
check_prepare(r"fn name<'lifetime$0>() {}", expect![[r#"9..17: lifetime"#]]);
@@ -1024,6 +1081,7 @@ mod foo$0;
Indel {
insert: "foo2",
delete: 4..7,
+ annotation: None,
},
],
),
@@ -1071,6 +1129,7 @@ use crate::foo$0::FooContent;
Indel {
insert: "quux",
delete: 8..11,
+ annotation: None,
},
],
),
@@ -1082,6 +1141,7 @@ use crate::foo$0::FooContent;
Indel {
insert: "quux",
delete: 11..14,
+ annotation: None,
},
],
),
@@ -1123,6 +1183,7 @@ mod fo$0o;
Indel {
insert: "foo2",
delete: 4..7,
+ annotation: None,
},
],
),
@@ -1171,6 +1232,7 @@ mod outer { mod fo$0o; }
Indel {
insert: "bar",
delete: 16..19,
+ annotation: None,
},
],
),
@@ -1242,6 +1304,7 @@ pub mod foo$0;
Indel {
insert: "foo2",
delete: 27..30,
+ annotation: None,
},
],
),
@@ -1253,6 +1316,7 @@ pub mod foo$0;
Indel {
insert: "foo2",
delete: 8..11,
+ annotation: None,
},
],
),
@@ -1308,6 +1372,7 @@ mod quux;
Indel {
insert: "foo2",
delete: 4..7,
+ annotation: None,
},
],
),
@@ -1441,10 +1506,12 @@ pub fn baz() {}
Indel {
insert: "r#fn",
delete: 4..7,
+ annotation: None,
},
Indel {
insert: "r#fn",
delete: 22..25,
+ annotation: None,
},
],
),
@@ -1509,10 +1576,12 @@ pub fn baz() {}
Indel {
insert: "foo",
delete: 4..8,
+ annotation: None,
},
Indel {
insert: "foo",
delete: 23..27,
+ annotation: None,
},
],
),
@@ -1574,6 +1643,7 @@ fn bar() {
Indel {
insert: "dyn",
delete: 7..10,
+ annotation: None,
},
],
),
@@ -1585,6 +1655,7 @@ fn bar() {
Indel {
insert: "r#dyn",
delete: 18..21,
+ annotation: None,
},
],
),
@@ -1614,6 +1685,7 @@ fn bar() {
Indel {
insert: "r#dyn",
delete: 7..10,
+ annotation: None,
},
],
),
@@ -1625,6 +1697,7 @@ fn bar() {
Indel {
insert: "dyn",
delete: 18..21,
+ annotation: None,
},
],
),
@@ -1654,6 +1727,7 @@ fn bar() {
Indel {
insert: "r#dyn",
delete: 7..10,
+ annotation: None,
},
],
),
@@ -1665,6 +1739,7 @@ fn bar() {
Indel {
insert: "dyn",
delete: 18..21,
+ annotation: None,
},
],
),
@@ -1701,10 +1776,12 @@ fn bar() {
Indel {
insert: "abc",
delete: 7..10,
+ annotation: None,
},
Indel {
insert: "abc",
delete: 32..35,
+ annotation: None,
},
],
),
@@ -1716,6 +1793,7 @@ fn bar() {
Indel {
insert: "abc",
delete: 18..23,
+ annotation: None,
},
],
),
@@ -1749,10 +1827,12 @@ fn bar() {
Indel {
insert: "abc",
delete: 7..12,
+ annotation: None,
},
Indel {
insert: "abc",
delete: 34..39,
+ annotation: None,
},
],
),
@@ -1764,6 +1844,7 @@ fn bar() {
Indel {
insert: "abc",
delete: 18..21,
+ annotation: None,
},
],
),