@@ -21,7 +21,7 @@ use crate::{display::TryToNav, FilePosition, FileSystemEdit, RangeInfo, SourceCh
21
21
22
22
type RenameResult < T > = Result < T , RenameError > ;
23
23
#[ derive( Debug ) ]
24
- pub struct RenameError ( pub ( crate ) String ) ;
24
+ pub struct RenameError ( String ) ;
25
25
26
26
impl fmt:: Display for RenameError {
27
27
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
@@ -47,16 +47,15 @@ pub(crate) fn prepare_rename(
47
47
let sema = Semantics :: new ( db) ;
48
48
let source_file = sema. parse ( position. file_id ) ;
49
49
let syntax = source_file. syntax ( ) ;
50
- let range = match & sema
50
+ let name_like = sema
51
51
. find_node_at_offset_with_descend ( & syntax, position. offset )
52
- . ok_or_else ( || format_err ! ( "No references found at position" ) ) ?
53
- {
52
+ . ok_or_else ( || format_err ! ( "No references found at position" ) ) ?;
53
+ let node = match & name_like {
54
54
ast:: NameLike :: Name ( it) => it. syntax ( ) ,
55
55
ast:: NameLike :: NameRef ( it) => it. syntax ( ) ,
56
56
ast:: NameLike :: Lifetime ( it) => it. syntax ( ) ,
57
- }
58
- . text_range ( ) ;
59
- Ok ( RangeInfo :: new ( range, ( ) ) )
57
+ } ;
58
+ Ok ( RangeInfo :: new ( sema. original_range ( node) . range , ( ) ) )
60
59
}
61
60
62
61
// Feature: Rename
@@ -546,6 +545,8 @@ mod tests {
546
545
547
546
use crate :: { fixture, FileId } ;
548
547
548
+ use super :: { RangeInfo , RenameError } ;
549
+
549
550
fn check ( new_name : & str , ra_fixture_before : & str , ra_fixture_after : & str ) {
550
551
let ra_fixture_after = & trim_indent ( ra_fixture_after) ;
551
552
let ( analysis, position) = fixture:: position ( ra_fixture_before) ;
@@ -591,6 +592,45 @@ mod tests {
591
592
expect. assert_debug_eq ( & source_change)
592
593
}
593
594
595
+ fn check_prepare ( ra_fixture : & str , expect : Expect ) {
596
+ let ( analysis, position) = fixture:: position ( ra_fixture) ;
597
+ let result = analysis
598
+ . prepare_rename ( position)
599
+ . unwrap_or_else ( |err| panic ! ( "PrepareRename was cancelled: {}" , err) ) ;
600
+ match result {
601
+ Ok ( RangeInfo { range, info : ( ) } ) => {
602
+ let source = analysis. file_text ( position. file_id ) . unwrap ( ) ;
603
+ expect. assert_eq ( & format ! ( "{:?}: {}" , range, & source[ range] ) )
604
+ }
605
+ Err ( RenameError ( err) ) => expect. assert_eq ( & err) ,
606
+ } ;
607
+ }
608
+
609
+ #[ test]
610
+ fn test_prepare_rename_namelikes ( ) {
611
+ check_prepare ( r"fn name$0<'lifetime>() {}" , expect ! [ [ r#"3..7: name"# ] ] ) ;
612
+ check_prepare ( r"fn name<'lifetime$0>() {}" , expect ! [ [ r#"8..17: 'lifetime"# ] ] ) ;
613
+ check_prepare ( r"fn name<'lifetime>() { name$0(); }" , expect ! [ [ r#"23..27: name"# ] ] ) ;
614
+ }
615
+
616
+ #[ test]
617
+ fn test_prepare_rename_in_macro ( ) {
618
+ check_prepare (
619
+ r"macro_rules! foo {
620
+ ($ident:ident) => {
621
+ pub struct $ident;
622
+ }
623
+ }
624
+ foo!(Foo$0);" ,
625
+ expect ! [ [ r#"83..86: Foo"# ] ] ,
626
+ ) ;
627
+ }
628
+
629
+ #[ test]
630
+ fn test_prepare_rename_keyword ( ) {
631
+ check_prepare ( r"struct$0 Foo;" , expect ! [ [ r#"No references found at position"# ] ] ) ;
632
+ }
633
+
594
634
#[ test]
595
635
fn test_rename_to_underscore ( ) {
596
636
check ( "_" , r#"fn main() { let i$0 = 1; }"# , r#"fn main() { let _ = 1; }"# ) ;
0 commit comments