tinymist_query/
will_rename_files.rs

1use crate::{create_change_annotation, do_rename_file, edits_to_document_changes, prelude::*};
2
3/// Handle [`workspace/willRenameFiles`] request is sent from the client to the
4/// server.
5///
6/// [`workspace/willRenameFiles`]: https://microsoft.github.io/language-server-protocol/specification#workspace_willRenameFiles
7#[derive(Debug, Clone)]
8pub struct WillRenameFilesRequest {
9    /// rename paths from `left` to `right`
10    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}