Merge #3244
3244: Rename module references r=matklad a=adamrk Rename references to a module when the module is renamed. This fixes some missing renames in the existing implementation. For example, renaming the module `foo` to `foo2` in this case: ```rust mod foo { pub fn bar() {} } fn main() { foo::bar() } ``` previously would not change the call `foo::bar()` to `foo2::bar()`, but now it will. Co-authored-by: adamrk <ark.email@gmail.com> Co-authored-by: Adam Bratschi-Kaye <ark.email@gmail.com>
This commit is contained in:
commit
d8b0943535
@ -98,6 +98,17 @@ fn rename_mod(
|
|||||||
};
|
};
|
||||||
source_file_edits.push(edit);
|
source_file_edits.push(edit);
|
||||||
|
|
||||||
|
if let Some(RangeInfo { range: _, info: refs }) = find_all_refs(db, position, None) {
|
||||||
|
let ref_edits = refs.references.into_iter().map(|reference| {
|
||||||
|
source_edit_from_file_id_range(
|
||||||
|
reference.file_range.file_id,
|
||||||
|
reference.file_range.range,
|
||||||
|
new_name,
|
||||||
|
)
|
||||||
|
});
|
||||||
|
source_file_edits.extend(ref_edits);
|
||||||
|
}
|
||||||
|
|
||||||
Some(SourceChange::from_edits("rename", source_file_edits, file_system_edits))
|
Some(SourceChange::from_edits("rename", source_file_edits, file_system_edits))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -383,6 +394,101 @@ fn test_rename_mod_in_dir() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_module_rename_in_path() {
|
||||||
|
test_rename(
|
||||||
|
r#"
|
||||||
|
mod <|>foo {
|
||||||
|
pub fn bar() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
foo::bar();
|
||||||
|
}"#,
|
||||||
|
"baz",
|
||||||
|
r#"
|
||||||
|
mod baz {
|
||||||
|
pub fn bar() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
baz::bar();
|
||||||
|
}"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_rename_mod_filename_and_path() {
|
||||||
|
let (analysis, position) = analysis_and_position(
|
||||||
|
"
|
||||||
|
//- /lib.rs
|
||||||
|
mod bar;
|
||||||
|
fn f() {
|
||||||
|
bar::foo::fun()
|
||||||
|
}
|
||||||
|
|
||||||
|
//- /bar.rs
|
||||||
|
pub mod foo<|>;
|
||||||
|
|
||||||
|
//- /bar/foo.rs
|
||||||
|
// pub fn fun() {}
|
||||||
|
",
|
||||||
|
);
|
||||||
|
let new_name = "foo2";
|
||||||
|
let source_change = analysis.rename(position, new_name).unwrap();
|
||||||
|
assert_debug_snapshot!(&source_change,
|
||||||
|
@r###"
|
||||||
|
Some(
|
||||||
|
RangeInfo {
|
||||||
|
range: [8; 11),
|
||||||
|
info: SourceChange {
|
||||||
|
label: "rename",
|
||||||
|
source_file_edits: [
|
||||||
|
SourceFileEdit {
|
||||||
|
file_id: FileId(
|
||||||
|
2,
|
||||||
|
),
|
||||||
|
edit: TextEdit {
|
||||||
|
atoms: [
|
||||||
|
AtomTextEdit {
|
||||||
|
delete: [8; 11),
|
||||||
|
insert: "foo2",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
SourceFileEdit {
|
||||||
|
file_id: FileId(
|
||||||
|
1,
|
||||||
|
),
|
||||||
|
edit: TextEdit {
|
||||||
|
atoms: [
|
||||||
|
AtomTextEdit {
|
||||||
|
delete: [27; 30),
|
||||||
|
insert: "foo2",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
file_system_edits: [
|
||||||
|
MoveFile {
|
||||||
|
src: FileId(
|
||||||
|
3,
|
||||||
|
),
|
||||||
|
dst_source_root: SourceRootId(
|
||||||
|
0,
|
||||||
|
),
|
||||||
|
dst_path: "bar/foo2.rs",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
cursor_position: None,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
"###);
|
||||||
|
}
|
||||||
|
|
||||||
fn test_rename(text: &str, new_name: &str, expected: &str) {
|
fn test_rename(text: &str, new_name: &str, expected: &str) {
|
||||||
let (analysis, position) = single_file_with_position(text);
|
let (analysis, position) = single_file_with_position(text);
|
||||||
let source_change = analysis.rename(position, new_name).unwrap();
|
let source_change = analysis.rename(position, new_name).unwrap();
|
||||||
|
Loading…
Reference in New Issue
Block a user