tinymist_query/
will_rename_files.rs1use crate::{create_change_annotation, do_rename_file, edits_to_document_changes, prelude::*};
2
3#[derive(Debug, Clone)]
8pub struct WillRenameFilesRequest {
9 pub paths: Vec<(PathBuf, PathBuf)>,
11}
12
13impl SemanticRequest for WillRenameFilesRequest {
14 type Response = WorkspaceEdit;
15
16 fn request(self, ctx: &mut LocalContext) -> Option<Self::Response> {
17 let mut edits: HashMap<Url, Vec<TextEdit>> = HashMap::new();
18
19 self.paths
20 .into_iter()
21 .map(|(left, right)| {
22 let diff = tinymist_std::path::diff(&right, &left)?;
23 log::info!("did rename diff: {diff:?}");
24 if diff.is_absolute() {
25 log::info!(
26 "bad rename: absolute path, base: {left:?}, new: {right:?}, diff: {diff:?}"
27 );
28 return None;
29 }
30
31 let def_fid = ctx.file_id_by_path(&left).ok()?;
32 log::info!("did rename def_fid: {def_fid:?}");
33
34 do_rename_file(ctx, def_fid, diff, &mut edits)
35 })
36 .collect::<Option<Vec<()>>>()?;
37 log::info!("did rename edits: {edits:?}");
38 let document_changes = edits_to_document_changes(edits, None);
39 if document_changes.is_empty() {
40 return None;
41 }
42
43 let change_annotations = Some(create_change_annotation(
44 "Typst Rename Files",
45 true,
46 Some("Renaming files should update imports".to_string()),
47 ));
48
49 Some(WorkspaceEdit {
50 changes: None,
51 document_changes: Some(lsp_types::DocumentChanges::Operations(document_changes)),
52 change_annotations,
53 })
54 }
55}