@@ -84,6 +84,7 @@ pub(crate) fn rename(
84
84
db : & RootDatabase ,
85
85
position : FilePosition ,
86
86
new_name : & str ,
87
+ rename_external : bool ,
87
88
) -> RenameResult < SourceChange > {
88
89
let sema = Semantics :: new ( db) ;
89
90
let source_file = sema. parse ( position. file_id ) ;
@@ -103,7 +104,7 @@ pub(crate) fn rename(
103
104
return rename_to_self ( & sema, local) ;
104
105
}
105
106
}
106
- def. rename ( & sema, new_name)
107
+ def. rename ( & sema, new_name, rename_external )
107
108
} )
108
109
. collect ( ) ;
109
110
@@ -122,9 +123,9 @@ pub(crate) fn will_rename_file(
122
123
let module = sema. to_module_def ( file_id) ?;
123
124
let def = Definition :: Module ( module) ;
124
125
let mut change = if is_raw_identifier ( new_name_stem) {
125
- def. rename ( & sema, & SmolStr :: from_iter ( [ "r#" , new_name_stem] ) ) . ok ( ) ?
126
+ def. rename ( & sema, & SmolStr :: from_iter ( [ "r#" , new_name_stem] ) , true ) . ok ( ) ?
126
127
} else {
127
- def. rename ( & sema, new_name_stem) . ok ( ) ?
128
+ def. rename ( & sema, new_name_stem, true ) . ok ( ) ?
128
129
} ;
129
130
change. file_system_edits . clear ( ) ;
130
131
Some ( change)
@@ -371,12 +372,21 @@ mod tests {
371
372
use test_utils:: assert_eq_text;
372
373
use text_edit:: TextEdit ;
373
374
374
- use crate :: { fixture, FileId } ;
375
+ use crate :: fixture;
375
376
376
377
use super :: { RangeInfo , RenameError } ;
377
378
378
- #[ track_caller]
379
379
fn check ( new_name : & str , ra_fixture_before : & str , ra_fixture_after : & str ) {
380
+ check_with_rename_config ( new_name, ra_fixture_before, ra_fixture_after, true ) ;
381
+ }
382
+
383
+ #[ track_caller]
384
+ fn check_with_rename_config (
385
+ new_name : & str ,
386
+ ra_fixture_before : & str ,
387
+ ra_fixture_after : & str ,
388
+ rename_external : bool ,
389
+ ) {
380
390
let ra_fixture_after = & trim_indent ( ra_fixture_after) ;
381
391
let ( analysis, position) = fixture:: position ( ra_fixture_before) ;
382
392
if !ra_fixture_after. starts_with ( "error: " ) {
@@ -385,23 +395,22 @@ mod tests {
385
395
}
386
396
}
387
397
let rename_result = analysis
388
- . rename ( position, new_name)
398
+ . rename ( position, new_name, rename_external )
389
399
. unwrap_or_else ( |err| panic ! ( "Rename to '{new_name}' was cancelled: {err}" ) ) ;
390
400
match rename_result {
391
401
Ok ( source_change) => {
392
402
let mut text_edit_builder = TextEdit :: builder ( ) ;
393
- let mut file_id: Option < FileId > = None ;
394
- for edit in source_change. source_file_edits {
395
- file_id = Some ( edit. 0 ) ;
396
- for indel in edit. 1 . 0 . into_iter ( ) {
397
- text_edit_builder. replace ( indel. delete , indel. insert ) ;
398
- }
399
- }
400
- if let Some ( file_id) = file_id {
401
- let mut result = analysis. file_text ( file_id) . unwrap ( ) . to_string ( ) ;
402
- text_edit_builder. finish ( ) . apply ( & mut result) ;
403
- assert_eq_text ! ( ra_fixture_after, & * result) ;
403
+ let ( & file_id, edit) = match source_change. source_file_edits . len ( ) {
404
+ 0 => return ,
405
+ 1 => source_change. source_file_edits . iter ( ) . next ( ) . unwrap ( ) ,
406
+ _ => ( & position. file_id , & source_change. source_file_edits [ & position. file_id ] ) ,
407
+ } ;
408
+ for indel in edit. 0 . iter ( ) {
409
+ text_edit_builder. replace ( indel. delete , indel. insert . clone ( ) ) ;
404
410
}
411
+ let mut result = analysis. file_text ( file_id) . unwrap ( ) . to_string ( ) ;
412
+ text_edit_builder. finish ( ) . apply ( & mut result) ;
413
+ assert_eq_text ! ( ra_fixture_after, & * result) ;
405
414
}
406
415
Err ( err) => {
407
416
if ra_fixture_after. starts_with ( "error:" ) {
@@ -417,8 +426,10 @@ mod tests {
417
426
418
427
fn check_expect ( new_name : & str , ra_fixture : & str , expect : Expect ) {
419
428
let ( analysis, position) = fixture:: position ( ra_fixture) ;
420
- let source_change =
421
- analysis. rename ( position, new_name) . unwrap ( ) . expect ( "Expect returned a RenameError" ) ;
429
+ let source_change = analysis
430
+ . rename ( position, new_name, true )
431
+ . unwrap ( )
432
+ . expect ( "Expect returned a RenameError" ) ;
422
433
expect. assert_eq ( & filter_expect ( source_change) )
423
434
}
424
435
@@ -2617,6 +2628,18 @@ use qux as frob;
2617
2628
2618
2629
#[ test]
2619
2630
fn disallow_renaming_for_non_local_definition ( ) {
2631
+ check_with_rename_config (
2632
+ "Baz" ,
2633
+ r#"
2634
+ //- /lib.rs crate:lib new_source_root:library
2635
+ pub struct S;
2636
+ //- /main.rs crate:main deps:lib new_source_root:local
2637
+ use lib::S$0;
2638
+ "# ,
2639
+ "error: Cannot rename a non-local definition. Set `renameExternalItems` to `true` to allow renaming for this item." ,
2640
+ false ,
2641
+ ) ;
2642
+
2620
2643
check (
2621
2644
"Baz" ,
2622
2645
r#"
@@ -2625,13 +2648,13 @@ pub struct S;
2625
2648
//- /main.rs crate:main deps:lib new_source_root:local
2626
2649
use lib::S$0;
2627
2650
"# ,
2628
- "error: Cannot rename a non-local definition. " ,
2651
+ "use lib::Baz; \n " ,
2629
2652
) ;
2630
2653
}
2631
2654
2632
2655
#[ test]
2633
2656
fn disallow_renaming_for_builtin_macros ( ) {
2634
- check (
2657
+ check_with_rename_config (
2635
2658
"Baz" ,
2636
2659
r#"
2637
2660
//- minicore: derive, hash
@@ -2640,8 +2663,9 @@ use core::hash::Hash;
2640
2663
#[derive(H$0ash)]
2641
2664
struct A;
2642
2665
"# ,
2643
- "error: Cannot rename a non-local definition." ,
2644
- )
2666
+ "error: Cannot rename a non-local definition. Set `renameExternalItems` to `true` to allow renaming for this item." ,
2667
+ false ,
2668
+ ) ;
2645
2669
}
2646
2670
2647
2671
#[ test]
0 commit comments