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.rs70
1 files changed, 47 insertions, 23 deletions
diff --git a/crates/ide/src/rename.rs b/crates/ide/src/rename.rs
index 3bf41defe3..9fce4bb0f8 100644
--- a/crates/ide/src/rename.rs
+++ b/crates/ide/src/rename.rs
@@ -84,6 +84,7 @@ pub(crate) fn rename(
db: &RootDatabase,
position: FilePosition,
new_name: &str,
+ rename_external: bool,
) -> RenameResult<SourceChange> {
let sema = Semantics::new(db);
let source_file = sema.parse(position.file_id);
@@ -103,7 +104,7 @@ pub(crate) fn rename(
return rename_to_self(&sema, local);
}
}
- def.rename(&sema, new_name)
+ def.rename(&sema, new_name, rename_external)
})
.collect();
@@ -122,9 +123,9 @@ pub(crate) fn will_rename_file(
let module = sema.to_module_def(file_id)?;
let def = Definition::Module(module);
let mut change = if is_raw_identifier(new_name_stem) {
- def.rename(&sema, &SmolStr::from_iter(["r#", new_name_stem])).ok()?
+ def.rename(&sema, &SmolStr::from_iter(["r#", new_name_stem]), true).ok()?
} else {
- def.rename(&sema, new_name_stem).ok()?
+ def.rename(&sema, new_name_stem, true).ok()?
};
change.file_system_edits.clear();
Some(change)
@@ -371,12 +372,21 @@ mod tests {
use test_utils::assert_eq_text;
use text_edit::TextEdit;
- use crate::{fixture, FileId};
+ use crate::fixture;
use super::{RangeInfo, RenameError};
- #[track_caller]
fn check(new_name: &str, ra_fixture_before: &str, ra_fixture_after: &str) {
+ check_with_rename_config(new_name, ra_fixture_before, ra_fixture_after, true);
+ }
+
+ #[track_caller]
+ fn check_with_rename_config(
+ new_name: &str,
+ ra_fixture_before: &str,
+ ra_fixture_after: &str,
+ rename_external: bool,
+ ) {
let ra_fixture_after = &trim_indent(ra_fixture_after);
let (analysis, position) = fixture::position(ra_fixture_before);
if !ra_fixture_after.starts_with("error: ") {
@@ -385,23 +395,22 @@ mod tests {
}
}
let rename_result = analysis
- .rename(position, new_name)
+ .rename(position, new_name, rename_external)
.unwrap_or_else(|err| panic!("Rename to '{new_name}' was cancelled: {err}"));
match rename_result {
Ok(source_change) => {
let mut text_edit_builder = TextEdit::builder();
- let mut file_id: Option<FileId> = None;
- for edit in source_change.source_file_edits {
- file_id = Some(edit.0);
- for indel in edit.1 .0.into_iter() {
- text_edit_builder.replace(indel.delete, indel.insert);
- }
- }
- if let Some(file_id) = file_id {
- let mut result = analysis.file_text(file_id).unwrap().to_string();
- text_edit_builder.finish().apply(&mut result);
- assert_eq_text!(ra_fixture_after, &*result);
+ let (&file_id, edit) = match source_change.source_file_edits.len() {
+ 0 => return,
+ 1 => source_change.source_file_edits.iter().next().unwrap(),
+ _ => (&position.file_id, &source_change.source_file_edits[&position.file_id]),
+ };
+ for indel in edit.0.iter() {
+ text_edit_builder.replace(indel.delete, indel.insert.clone());
}
+ let mut result = analysis.file_text(file_id).unwrap().to_string();
+ text_edit_builder.finish().apply(&mut result);
+ assert_eq_text!(ra_fixture_after, &*result);
}
Err(err) => {
if ra_fixture_after.starts_with("error:") {
@@ -417,8 +426,10 @@ mod tests {
fn check_expect(new_name: &str, ra_fixture: &str, expect: Expect) {
let (analysis, position) = fixture::position(ra_fixture);
- let source_change =
- analysis.rename(position, new_name).unwrap().expect("Expect returned a RenameError");
+ let source_change = analysis
+ .rename(position, new_name, true)
+ .unwrap()
+ .expect("Expect returned a RenameError");
expect.assert_eq(&filter_expect(source_change))
}
@@ -2617,6 +2628,18 @@ use qux as frob;
#[test]
fn disallow_renaming_for_non_local_definition() {
+ check_with_rename_config(
+ "Baz",
+ r#"
+//- /lib.rs crate:lib new_source_root:library
+pub struct S;
+//- /main.rs crate:main deps:lib new_source_root:local
+use lib::S$0;
+"#,
+ "error: Cannot rename a non-local definition as the config for it is disabled",
+ false,
+ );
+
check(
"Baz",
r#"
@@ -2625,13 +2648,13 @@ pub struct S;
//- /main.rs crate:main deps:lib new_source_root:local
use lib::S$0;
"#,
- "error: Cannot rename a non-local definition.",
+ "use lib::Baz;\n",
);
}
#[test]
fn disallow_renaming_for_builtin_macros() {
- check(
+ check_with_rename_config(
"Baz",
r#"
//- minicore: derive, hash
@@ -2640,8 +2663,9 @@ use core::hash::Hash;
#[derive(H$0ash)]
struct A;
"#,
- "error: Cannot rename a non-local definition.",
- )
+ "error: Cannot rename a non-local definition as the config for it is disabled",
+ false,
+ );
}
#[test]