Skip to content

Commit cbb1979

Browse files
committed
fix: rename works when invoked on a reference
1 parent 15c4b3f commit cbb1979

File tree

1 file changed

+22
-24
lines changed

1 file changed

+22
-24
lines changed

crates/ide/src/rename.rs

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use ide_db::{
1010
rename::{bail, format_err, source_edit_from_references, IdentifierKind},
1111
RootDatabase,
1212
};
13-
use stdx::never;
13+
use stdx::{always, never};
1414
use syntax::{ast, AstNode, SyntaxNode};
1515

1616
use text_edit::TextEdit;
@@ -31,10 +31,13 @@ pub(crate) fn prepare_rename(
3131
let source_file = sema.parse(position.file_id);
3232
let syntax = source_file.syntax();
3333

34-
let def = find_definition(&sema, syntax, position)?;
35-
let frange = def
36-
.range_for_rename(&sema)
37-
.ok_or_else(|| format_err!("No references found at position"))?;
34+
let (name_like, def) = find_definition(&sema, syntax, position)?;
35+
if def.range_for_rename(&sema).is_none() {
36+
bail!("No references found at position")
37+
}
38+
39+
let frange = sema.original_range(name_like.syntax());
40+
always!(frange.range.contains_inclusive(position.offset) && frange.file_id == position.file_id);
3841
Ok(RangeInfo::new(frange.range, ()))
3942
}
4043

@@ -55,31 +58,23 @@ pub(crate) fn rename(
5558
new_name: &str,
5659
) -> RenameResult<SourceChange> {
5760
let sema = Semantics::new(db);
58-
rename_with_semantics(&sema, position, new_name)
59-
}
60-
61-
pub(crate) fn rename_with_semantics(
62-
sema: &Semantics<RootDatabase>,
63-
position: FilePosition,
64-
new_name: &str,
65-
) -> RenameResult<SourceChange> {
6661
let source_file = sema.parse(position.file_id);
6762
let syntax = source_file.syntax();
6863

69-
let def = find_definition(sema, syntax, position)?;
64+
let (_name_like, def) = find_definition(&sema, syntax, position)?;
7065

7166
if let Definition::Local(local) = def {
7267
if let Some(self_param) = local.as_self_param(sema.db) {
7368
cov_mark::hit!(rename_self_to_param);
74-
return rename_self_to_param(sema, local, self_param, new_name);
69+
return rename_self_to_param(&sema, local, self_param, new_name);
7570
}
7671
if new_name == "self" {
7772
cov_mark::hit!(rename_to_self);
78-
return rename_to_self(sema, local);
73+
return rename_to_self(&sema, local);
7974
}
8075
}
8176

82-
def.rename(sema, new_name)
77+
def.rename(&sema, new_name)
8378
}
8479

8580
/// Called by the client when it is about to rename a file.
@@ -100,11 +95,12 @@ fn find_definition(
10095
sema: &Semantics<RootDatabase>,
10196
syntax: &SyntaxNode,
10297
position: FilePosition,
103-
) -> RenameResult<Definition> {
104-
match sema
105-
.find_node_at_offset_with_descend(syntax, position.offset)
106-
.ok_or_else(|| format_err!("No references found at position"))?
107-
{
98+
) -> RenameResult<(ast::NameLike, Definition)> {
99+
let name_like = sema
100+
.find_node_at_offset_with_descend::<ast::NameLike>(syntax, position.offset)
101+
.ok_or_else(|| format_err!("No references found at position"))?;
102+
103+
let def = match &name_like {
108104
// renaming aliases would rename the item being aliased as the HIR doesn't track aliases yet
109105
ast::NameLike::Name(name)
110106
if name.syntax().parent().map_or(false, |it| ast::Rename::can_cast(it.kind())) =>
@@ -134,7 +130,9 @@ fn find_definition(
134130
.map(|it| it.referenced_or_defined(sema.db))
135131
}),
136132
}
137-
.ok_or_else(|| format_err!("No references found at position"))
133+
.ok_or_else(|| format_err!("No references found at position"))?;
134+
135+
Ok((name_like, def))
138136
}
139137

140138
fn rename_to_self(sema: &Semantics<RootDatabase>, local: hir::Local) -> RenameResult<SourceChange> {
@@ -328,7 +326,7 @@ mod tests {
328326
fn test_prepare_rename_namelikes() {
329327
check_prepare(r"fn name$0<'lifetime>() {}", expect![[r#"3..7: name"#]]);
330328
check_prepare(r"fn name<'lifetime$0>() {}", expect![[r#"8..17: 'lifetime"#]]);
331-
check_prepare(r"fn name<'lifetime>() { name$0(); }", expect![[r#"3..7: name"#]]);
329+
check_prepare(r"fn name<'lifetime>() { name$0(); }", expect![[r#"23..27: name"#]]);
332330
}
333331

334332
#[test]

0 commit comments

Comments
 (0)