Unnamed repository; edit this file 'description' to name the repository.
fix logic error: alias detection was too lenient
Anatol Ulrich 2021-10-27
parent 6cd15c2 · commit 4a1a5ff
-rw-r--r--crates/ide/src/rename.rs41
1 files changed, 23 insertions, 18 deletions
diff --git a/crates/ide/src/rename.rs b/crates/ide/src/rename.rs
index 76f694aa51..2f95557a8e 100644
--- a/crates/ide/src/rename.rs
+++ b/crates/ide/src/rename.rs
@@ -147,22 +147,27 @@ fn find_definitions(
})
.map(|def| (name_like.clone(), def))
.ok_or_else(|| format_err!("No references found at position")),
- ast::NameLike::NameRef(name_ref) => NameRefClass::classify(sema, name_ref)
- .map(|class| match class {
- NameRefClass::Definition(def) => def,
- NameRefClass::FieldShorthand { local_ref, field_ref: _ } => {
- Definition::Local(local_ref)
- }
- })
- .and_then(|def| {
- // 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_string() != name_ref.text()) {
- None
- } else {
- Some((name_like.clone(), def))
- }
- })
- .ok_or_else(|| format_err!("Renaming aliases is currently unsupported")),
+ ast::NameLike::NameRef(name_ref) => {
+ NameRefClass::classify(sema, name_ref)
+ .map(|class| match class {
+ NameRefClass::Definition(def) => def,
+ NameRefClass::FieldShorthand { local_ref, field_ref: _ } => {
+ Definition::Local(local_ref)
+ }
+ })
+ .ok_or_else(|| format_err!("No references found at position"))
+ .and_then(|def| {
+ // 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_string() != name_ref.text())
+ {
+ Err(format_err!("Renaming aliases is currently unsupported"))
+ } else {
+ Ok((name_like.clone(), def))
+ }
+ })
+ }
ast::NameLike::Lifetime(lifetime) => {
NameRefClass::classify_lifetime(sema, lifetime)
.and_then(|class| match class {
@@ -183,8 +188,8 @@ fn find_definitions(
});
// TODO avoid collect() somehow?
- let v: RenameResult<Vec<(ast::NameLike, Definition)>> = symbols.collect();
- match v {
+ let res: RenameResult<Vec<(ast::NameLike, Definition)>> = symbols.collect();
+ match res {
// remove duplicates
Ok(v) => {
if v.is_empty() {