@@ -84,6 +84,7 @@ pub(crate) fn rename(
8484 db : & RootDatabase ,
8585 position : FilePosition ,
8686 new_name : & str ,
87+ rename_external : bool ,
8788) -> RenameResult < SourceChange > {
8889 let sema = Semantics :: new ( db) ;
8990 let source_file = sema. parse ( position. file_id ) ;
@@ -103,7 +104,7 @@ pub(crate) fn rename(
103104 return rename_to_self ( & sema, local) ;
104105 }
105106 }
106- def. rename ( & sema, new_name)
107+ def. rename ( & sema, new_name, rename_external )
107108 } )
108109 . collect ( ) ;
109110
@@ -122,9 +123,9 @@ pub(crate) fn will_rename_file(
122123 let module = sema. to_module_def ( file_id) ?;
123124 let def = Definition :: Module ( module) ;
124125 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 ( ) ?
126127 } else {
127- def. rename ( & sema, new_name_stem) . ok ( ) ?
128+ def. rename ( & sema, new_name_stem, true ) . ok ( ) ?
128129 } ;
129130 change. file_system_edits . clear ( ) ;
130131 Some ( change)
@@ -375,8 +376,17 @@ mod tests {
375376
376377 use super :: { RangeInfo , RenameError } ;
377378
378- #[ track_caller]
379379 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+ ) {
380390 let ra_fixture_after = & trim_indent ( ra_fixture_after) ;
381391 let ( analysis, position) = fixture:: position ( ra_fixture_before) ;
382392 if !ra_fixture_after. starts_with ( "error: " ) {
@@ -385,7 +395,7 @@ mod tests {
385395 }
386396 }
387397 let rename_result = analysis
388- . rename ( position, new_name)
398+ . rename ( position, new_name, rename_external )
389399 . unwrap_or_else ( |err| panic ! ( "Rename to '{new_name}' was cancelled: {err}" ) ) ;
390400 match rename_result {
391401 Ok ( source_change) => {
@@ -417,8 +427,10 @@ mod tests {
417427
418428 fn check_expect ( new_name : & str , ra_fixture : & str , expect : Expect ) {
419429 let ( analysis, position) = fixture:: position ( ra_fixture) ;
420- let source_change =
421- analysis. rename ( position, new_name) . unwrap ( ) . expect ( "Expect returned a RenameError" ) ;
430+ let source_change = analysis
431+ . rename ( position, new_name, true )
432+ . unwrap ( )
433+ . expect ( "Expect returned a RenameError" ) ;
422434 expect. assert_eq ( & filter_expect ( source_change) )
423435 }
424436
@@ -2617,6 +2629,18 @@ use qux as frob;
26172629
26182630 #[ test]
26192631 fn disallow_renaming_for_non_local_definition ( ) {
2632+ check_with_rename_config (
2633+ "Baz" ,
2634+ r#"
2635+ //- /lib.rs crate:lib new_source_root:library
2636+ pub struct S;
2637+ //- /main.rs crate:main deps:lib new_source_root:local
2638+ use lib::S$0;
2639+ "# ,
2640+ "error: Cannot rename a non-local definition. Set `renameExternalItems` to `true` to allow renaming for this item." ,
2641+ false ,
2642+ ) ;
2643+
26202644 check (
26212645 "Baz" ,
26222646 r#"
@@ -2625,13 +2649,13 @@ pub struct S;
26252649//- /main.rs crate:main deps:lib new_source_root:local
26262650use lib::S$0;
26272651"# ,
2628- "error: Cannot rename a non-local definition. " ,
2652+ "use lib::Baz; " ,
26292653 ) ;
26302654 }
26312655
26322656 #[ test]
26332657 fn disallow_renaming_for_builtin_macros ( ) {
2634- check (
2658+ check_with_rename_config (
26352659 "Baz" ,
26362660 r#"
26372661//- minicore: derive, hash
@@ -2640,8 +2664,9 @@ use core::hash::Hash;
26402664#[derive(H$0ash)]
26412665struct A;
26422666 "# ,
2643- "error: Cannot rename a non-local definition." ,
2644- )
2667+ "error: Cannot rename a non-local definition. Set `renameExternalItems` to `true` to allow renaming for this item." ,
2668+ false ,
2669+ ) ;
26452670 }
26462671
26472672 #[ test]
0 commit comments