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.rs40
1 files changed, 24 insertions, 16 deletions
diff --git a/crates/ide/src/rename.rs b/crates/ide/src/rename.rs
index 3d08e2f371..9581474ca7 100644
--- a/crates/ide/src/rename.rs
+++ b/crates/ide/src/rename.rs
@@ -6,16 +6,17 @@
use hir::{AsAssocItem, HirFileIdExt, InFile, Semantics};
use ide_db::{
- base_db::{FileId, FileRange},
defs::{Definition, NameClass, NameRefClass},
rename::{bail, format_err, source_edit_from_references, IdentifierKind},
source_change::SourceChangeBuilder,
- RootDatabase,
+ FileId, FileRange, RootDatabase,
};
use itertools::Itertools;
+use span::Edition;
use stdx::{always, never};
use syntax::{
ast, utils::is_raw_identifier, AstNode, SmolStr, SyntaxKind, SyntaxNode, TextRange, TextSize,
+ ToSmolStr,
};
use text_edit::TextEdit;
@@ -33,7 +34,7 @@ pub(crate) fn prepare_rename(
position: FilePosition,
) -> RenameResult<RangeInfo<()>> {
let sema = Semantics::new(db);
- let source_file = sema.parse(position.file_id);
+ let source_file = sema.parse_guess_edition(position.file_id);
let syntax = source_file.syntax();
let res = find_definitions(&sema, syntax, position)?
@@ -87,7 +88,10 @@ pub(crate) fn rename(
new_name: &str,
) -> RenameResult<SourceChange> {
let sema = Semantics::new(db);
- let source_file = sema.parse(position.file_id);
+ let file_id = sema
+ .attach_first_edition(position.file_id)
+ .ok_or_else(|| format_err!("No references found at position"))?;
+ let source_file = sema.parse(file_id);
let syntax = source_file.syntax();
let defs = find_definitions(&sema, syntax, position)?;
@@ -98,7 +102,7 @@ pub(crate) fn rename(
// FIXME: This can use the `ide_db::rename_reference` (or def.rename) method once we can
// properly find "direct" usages/references.
.map(|(.., def)| {
- match IdentifierKind::classify(new_name)? {
+ match IdentifierKind::classify(Edition::CURRENT_FIXME, new_name)? {
IdentifierKind::Ident => (),
IdentifierKind::Lifetime => {
bail!("Cannot alias reference to a lifetime identifier")
@@ -109,7 +113,7 @@ pub(crate) fn rename(
let mut usages = def.usages(&sema).all();
// FIXME: hack - removes the usage that triggered this rename operation.
- match usages.references.get_mut(&position.file_id).and_then(|refs| {
+ match usages.references.get_mut(&file_id).and_then(|refs| {
refs.iter()
.position(|ref_| ref_.range.contains_inclusive(position.offset))
.map(|idx| refs.remove(idx))
@@ -119,9 +123,9 @@ pub(crate) fn rename(
};
let mut source_change = SourceChange::default();
- source_change.extend(usages.references.get_mut(&position.file_id).iter().map(
- |refs| (position.file_id, source_edit_from_references(refs, def, new_name)),
- ));
+ source_change.extend(usages.references.get_mut(&file_id).iter().map(|refs| {
+ (position.file_id, source_edit_from_references(refs, def, new_name))
+ }));
Ok(source_change)
})
@@ -266,7 +270,7 @@ fn find_definitions(
// if the name differs from the definitions name it has to be an alias
if def
.name(sema.db)
- .map_or(false, |it| it.to_smol_str() != name_ref.text().as_str())
+ .map_or(false, |it| it.display_no_db().to_smolstr() != name_ref.text().as_str())
{
Err(format_err!("Renaming aliases is currently unsupported"))
} else {
@@ -300,7 +304,11 @@ fn find_definitions(
Err(format_err!("No references found at position"))
} else {
// remove duplicates, comparing `Definition`s
- Ok(v.into_iter().unique_by(|&(.., def)| def).collect::<Vec<_>>().into_iter())
+ Ok(v.into_iter()
+ .unique_by(|&(.., def)| def)
+ .map(|(a, b, c)| (a.into(), b, c))
+ .collect::<Vec<_>>()
+ .into_iter())
}
}
Err(e) => Err(e),
@@ -368,8 +376,8 @@ fn rename_to_self(
let def = Definition::Local(local);
let usages = def.usages(sema).all();
let mut source_change = SourceChange::default();
- source_change.extend(usages.iter().map(|(&file_id, references)| {
- (file_id, source_edit_from_references(references, def, "self"))
+ source_change.extend(usages.iter().map(|(file_id, references)| {
+ (file_id.into(), source_edit_from_references(references, def, "self"))
}));
source_change.insert_source_edit(
file_id.original_file(sema.db),
@@ -390,7 +398,7 @@ fn rename_self_to_param(
return Ok(SourceChange::default());
}
- let identifier_kind = IdentifierKind::classify(new_name)?;
+ let identifier_kind = IdentifierKind::classify(Edition::CURRENT_FIXME, new_name)?;
let InFile { file_id, value: self_param } =
sema.source(self_param).ok_or_else(|| format_err!("cannot find function source"))?;
@@ -404,8 +412,8 @@ fn rename_self_to_param(
}
let mut source_change = SourceChange::default();
source_change.insert_source_edit(file_id.original_file(sema.db), edit);
- source_change.extend(usages.iter().map(|(&file_id, references)| {
- (file_id, source_edit_from_references(references, def, new_name))
+ source_change.extend(usages.iter().map(|(file_id, references)| {
+ (file_id.into(), source_edit_from_references(references, def, new_name))
}));
Ok(source_change)
}