]> git.lizzy.rs Git - rust.git/blobdiff - crates/ide_db/src/rename.rs
fix: move dir on rename mod
[rust.git] / crates / ide_db / src / rename.rs
index 970ca2b6d7a4dfd8a68a63c74692397f82613ee7..589975406a4ffa2354ad726c3eed365760bf1b22 100644 (file)
@@ -10,7 +10,7 @@
 //!
 //! Another can of worms are macros:
 //!
-//! ```
+//! ```ignore
 //! macro_rules! m { () => { fn f() {} } }
 //! m!();
 //! fn main() {
@@ -34,9 +34,9 @@
 
 use crate::{
     defs::Definition,
-    helpers::node_ext::expr_as_name_ref,
     search::FileReference,
     source_change::{FileSystemEdit, SourceChange},
+    syntax_helpers::node_ext::expr_as_name_ref,
     RootDatabase,
 };
 
@@ -178,17 +178,23 @@ fn rename_mod(
     let mut source_change = SourceChange::default();
 
     let InFile { file_id, value: def_source } = module.definition_source(sema.db);
-    let file_id = file_id.original_file(sema.db);
     if let ModuleSource::SourceFile(..) = def_source {
-        // mod is defined in path/to/dir/mod.rs
-        let path = if module.is_mod_rs(sema.db) {
-            format!("../{}/mod.rs", new_name)
-        } else {
-            format!("{}.rs", new_name)
-        };
-        let dst = AnchoredPathBuf { anchor: file_id, path };
-        let move_file = FileSystemEdit::MoveFile { src: file_id, dst };
-        source_change.push_file_system_edit(move_file);
+        let anchor = file_id.original_file(sema.db);
+        // not mod.rs and doesn't has children, rename file only
+        if !module.is_mod_rs(sema.db) && module.children(sema.db).next().is_none() {
+            let path = format!("{}.rs", new_name);
+            let dst = AnchoredPathBuf { anchor, path };
+            source_change.push_file_system_edit(FileSystemEdit::MoveFile { src: anchor, dst })
+        } else if let Some(mod_name) = module.name(sema.db) {
+            // is mod.rs or has children, rename dir
+            let src = AnchoredPathBuf { anchor, path: mod_name.to_string() };
+            let dst = AnchoredPathBuf { anchor, path: new_name.to_string() };
+            source_change.push_file_system_edit(FileSystemEdit::MoveDir {
+                src,
+                src_id: anchor,
+                dst,
+            })
+        }
     }
 
     if let Some(src) = module.declaration_source(sema.db) {
@@ -293,8 +299,18 @@ fn rename_reference(
         (file_id, source_edit_from_references(references, def, new_name))
     }));
 
-    let (file_id, edit) = source_edit_from_def(sema, def, new_name)?;
-    source_change.insert_source_edit(file_id, edit);
+    let mut insert_def_edit = |def| {
+        let (file_id, edit) = source_edit_from_def(sema, def, new_name)?;
+        source_change.insert_source_edit(file_id, edit);
+        Ok(())
+    };
+    match def {
+        Definition::Local(l) => l
+            .associated_locals(sema.db)
+            .iter()
+            .try_for_each(|&local| insert_def_edit(Definition::Local(local))),
+        def => insert_def_edit(def),
+    }?;
     Ok(source_change)
 }