mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-08-04 02:39:32 +00:00
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:
parent
04439c8cce
commit
42e8e4ac4e
6 changed files with 251 additions and 44 deletions
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue