about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--crates/ide/src/rename.rs28
-rw-r--r--crates/ide_db/src/rename.rs21
-rw-r--r--docs/dev/lsp-extensions.md2
3 files changed, 44 insertions, 7 deletions
diff --git a/crates/ide/src/rename.rs b/crates/ide/src/rename.rs
index 971bcede5ac..daba317e427 100644
--- a/crates/ide/src/rename.rs
+++ b/crates/ide/src/rename.rs
@@ -1134,6 +1134,34 @@ pub mod foo$0;
     }
 
     #[test]
+    fn test_rename_mod_in_macro() {
+        check(
+            "bar",
+            r#"
+//- /foo.rs
+
+//- /lib.rs
+macro_rules! submodule {
+    ($name:ident) => {
+        mod $name;
+    };
+}
+
+submodule!($0foo);
+"#,
+            r#"
+macro_rules! submodule {
+    ($name:ident) => {
+        mod $name;
+    };
+}
+
+submodule!(bar);
+"#,
+        )
+    }
+
+    #[test]
     fn test_enum_variant_from_module_1() {
         cov_mark::check!(rename_non_local);
         check(
diff --git a/crates/ide_db/src/rename.rs b/crates/ide_db/src/rename.rs
index 4392ae3e5ab..404e17c022b 100644
--- a/crates/ide_db/src/rename.rs
+++ b/crates/ide_db/src/rename.rs
@@ -188,16 +188,23 @@ fn rename_mod(
         source_change.push_file_system_edit(move_file);
     }
 
-    if let Some(InFile { file_id, value: decl_source }) = module.declaration_source(sema.db) {
-        let file_id = file_id.original_file(sema.db);
-        match decl_source.name() {
-            Some(name) => source_change.insert_source_edit(
-                file_id,
-                TextEdit::replace(name.syntax().text_range(), new_name.to_string()),
-            ),
+    if let Some(src) = module.declaration_source(sema.db) {
+        let file_id = src.file_id.original_file(sema.db);
+        match src.value.name() {
+            Some(name) => {
+                if let Some(file_range) =
+                    src.with_value(name.syntax()).original_file_range_opt(sema.db)
+                {
+                    source_change.insert_source_edit(
+                        file_id,
+                        TextEdit::replace(file_range.range, new_name.to_string()),
+                    )
+                };
+            }
             _ => never!("Module source node is missing a name"),
         }
     }
+
     let def = Definition::Module(module);
     let usages = def.usages(sema).all();
     let ref_edits = usages.iter().map(|(&file_id, references)| {
diff --git a/docs/dev/lsp-extensions.md b/docs/dev/lsp-extensions.md
index adea925b51e..85df1188a8a 100644
--- a/docs/dev/lsp-extensions.md
+++ b/docs/dev/lsp-extensions.md
@@ -278,6 +278,8 @@ interface SsrParams {
     textDocument: TextDocumentIdentifier;
     /// Position where SSR was invoked.
     position: Position;
+    /// Current selections. Search/replace will be restricted to these if non-empty.
+    selections: Range[];
 }
 ```