Implement workspace/willRenameFiles for single-level file moves

Renames modules during file rename if they're in the same directory.
This commit is contained in:
Jeremy Kolb 2020-12-22 14:19:51 -05:00
parent 27ccde9ce9
commit 4f989cfa08
5 changed files with 92 additions and 6 deletions

View file

@ -535,6 +535,14 @@ impl Analysis {
self.with_db(|db| references::rename::prepare_rename(db, position))
}
pub fn will_rename_file(
&self,
file_id: FileId,
new_name_stem: &str,
) -> Cancelable<Option<SourceChange>> {
self.with_db(|db| references::rename::will_rename_file(db, file_id, new_name_stem))
}
pub fn structural_search_replace(
&self,
query: &str,

View file

@ -6,7 +6,7 @@ use std::{
};
use hir::{Module, ModuleDef, ModuleSource, Semantics};
use ide_db::base_db::{AnchoredPathBuf, FileRange, SourceDatabaseExt};
use ide_db::base_db::{AnchoredPathBuf, FileId, FileRange, SourceDatabaseExt};
use ide_db::{
defs::{Definition, NameClass, NameRefClass},
RootDatabase,
@ -110,6 +110,23 @@ pub(crate) fn rename_with_semantics(
}
}
pub(crate) fn will_rename_file(
db: &RootDatabase,
file_id: FileId,
new_name_stem: &str,
) -> Option<SourceChange> {
let sema = Semantics::new(db);
let module = sema.to_module_def(file_id)?;
let decl = module.declaration_source(db)?;
let range = decl.value.name()?.syntax().text_range();
let position = FilePosition { file_id: decl.file_id.original_file(db), offset: range.start() };
let mut change = rename_mod(&sema, position, module, new_name_stem).ok()?.info;
change.file_system_edits.clear();
Some(change)
}
fn find_module_at_offset(
sema: &Semantics<RootDatabase>,
position: FilePosition,