@@ -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} ;
1414use syntax:: { ast, AstNode , SyntaxNode } ;
1515
1616use 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
140138fn 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