@@ -10,7 +10,7 @@ use ide_db::{
10
10
rename:: { bail, format_err, source_edit_from_references, IdentifierKind } ,
11
11
RootDatabase ,
12
12
} ;
13
- use stdx:: never;
13
+ use stdx:: { always , never} ;
14
14
use syntax:: { ast, AstNode , SyntaxNode } ;
15
15
16
16
use text_edit:: TextEdit ;
@@ -31,10 +31,13 @@ pub(crate) fn prepare_rename(
31
31
let source_file = sema. parse ( position. file_id ) ;
32
32
let syntax = source_file. syntax ( ) ;
33
33
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) ;
38
41
Ok ( RangeInfo :: new ( frange. range , ( ) ) )
39
42
}
40
43
@@ -55,31 +58,23 @@ pub(crate) fn rename(
55
58
new_name : & str ,
56
59
) -> RenameResult < SourceChange > {
57
60
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 > {
66
61
let source_file = sema. parse ( position. file_id ) ;
67
62
let syntax = source_file. syntax ( ) ;
68
63
69
- let def = find_definition ( sema, syntax, position) ?;
64
+ let ( _name_like , def) = find_definition ( & sema, syntax, position) ?;
70
65
71
66
if let Definition :: Local ( local) = def {
72
67
if let Some ( self_param) = local. as_self_param ( sema. db ) {
73
68
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) ;
75
70
}
76
71
if new_name == "self" {
77
72
cov_mark:: hit!( rename_to_self) ;
78
- return rename_to_self ( sema, local) ;
73
+ return rename_to_self ( & sema, local) ;
79
74
}
80
75
}
81
76
82
- def. rename ( sema, new_name)
77
+ def. rename ( & sema, new_name)
83
78
}
84
79
85
80
/// Called by the client when it is about to rename a file.
@@ -100,11 +95,12 @@ fn find_definition(
100
95
sema : & Semantics < RootDatabase > ,
101
96
syntax : & SyntaxNode ,
102
97
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 {
108
104
// renaming aliases would rename the item being aliased as the HIR doesn't track aliases yet
109
105
ast:: NameLike :: Name ( name)
110
106
if name. syntax ( ) . parent ( ) . map_or ( false , |it| ast:: Rename :: can_cast ( it. kind ( ) ) ) =>
@@ -134,7 +130,9 @@ fn find_definition(
134
130
. map ( |it| it. referenced_or_defined ( sema. db ) )
135
131
} ) ,
136
132
}
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) )
138
136
}
139
137
140
138
fn rename_to_self ( sema : & Semantics < RootDatabase > , local : hir:: Local ) -> RenameResult < SourceChange > {
@@ -328,7 +326,7 @@ mod tests {
328
326
fn test_prepare_rename_namelikes ( ) {
329
327
check_prepare ( r"fn name$0<'lifetime>() {}" , expect ! [ [ r#"3..7: name"# ] ] ) ;
330
328
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"# ] ] ) ;
332
330
}
333
331
334
332
#[ test]
0 commit comments