Enhance renaming to include identifiers that are generated from the original symbol

Co-authored-by: Jake Goulding <jake.goulding@integer32.com>
This commit is contained in:
Lukas Wirth 2025-05-30 10:41:08 +02:00
parent 04439c8cce
commit 42e8e4ac4e
6 changed files with 251 additions and 44 deletions

View file

@ -70,15 +70,19 @@ macro_rules! _bail {
}
pub use _bail as bail;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum RenameDefinition {
Yes,
No,
}
impl Definition {
pub fn rename(
&self,
sema: &Semantics<'_, RootDatabase>,
new_name: &str,
rename_definition: RenameDefinition,
) -> Result<SourceChange> {
// We append `r#` if needed.
let new_name = new_name.trim_start_matches("r#");
// self.krate() returns None if
// self is a built-in attr, built-in type or tool module.
// it is not allowed for these defs to be renamed.
@ -103,8 +107,10 @@ impl Definition {
bail!("Cannot rename a builtin attr.")
}
Definition::SelfType(_) => bail!("Cannot rename `Self`"),
Definition::Macro(mac) => rename_reference(sema, Definition::Macro(mac), new_name),
def => rename_reference(sema, def, new_name),
Definition::Macro(mac) => {
rename_reference(sema, Definition::Macro(mac), new_name, rename_definition)
}
def => rename_reference(sema, def, new_name, rename_definition),
}
}
@ -328,6 +334,7 @@ fn rename_reference(
sema: &Semantics<'_, RootDatabase>,
def: Definition,
new_name: &str,
rename_definition: RenameDefinition,
) -> Result<SourceChange> {
let ident_kind = IdentifierKind::classify(new_name)?;
@ -366,11 +373,12 @@ fn rename_reference(
source_edit_from_references(references, def, new_name, file_id.edition(sema.db)),
)
}));
// This needs to come after the references edits, because we change the annotation of existing edits
// if a conflict is detected.
let (file_id, edit) = source_edit_from_def(sema, def, new_name, &mut source_change)?;
source_change.insert_source_edit(file_id, edit);
if rename_definition == RenameDefinition::Yes {
// This needs to come after the references edits, because we change the annotation of existing edits
// if a conflict is detected.
let (file_id, edit) = source_edit_from_def(sema, def, new_name, &mut source_change)?;
source_change.insert_source_edit(file_id, edit);
}
Ok(source_change)
}