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.rs | 70 |
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] |