Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-view/src/editor.rs')
| -rw-r--r-- | helix-view/src/editor.rs | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index 62cf3592..104adb39 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -1598,6 +1598,96 @@ impl Editor { Ok(()) } + pub fn create_path(&mut self, path: &Path, is_dir: bool) -> io::Result<()> { + let path = canonicalize(path); + let language_servers: Vec<_> = self + .language_servers + .iter_clients() + .filter(|client| client.is_initialized()) + .cloned() + .collect(); + for language_server in language_servers { + let Some(request) = language_server.will_create(&path, is_dir) else { + continue; + }; + let edit = match helix_lsp::block_on(request) { + Ok(edit) => edit.unwrap_or_default(), + Err(err) => { + log::error!("invalid willCreate response: {err:?}"); + continue; + } + }; + if let Err(err) = self.apply_workspace_edit(language_server.offset_encoding(), &edit) { + log::error!("failed to apply workspace edit: {err:?}") + } + } + + if let Some(dir) = path.parent() { + if !dir.is_dir() { + fs::create_dir_all(dir)?; + } + } + if is_dir { + fs::create_dir(&path)?; + } else { + fs::write(&path, [])?; + } + + for ls in self.language_servers.iter_clients() { + if !ls.is_initialized() { + continue; + } + ls.did_create(&path, is_dir); + } + self.language_servers.file_event_handler.file_changed(path); + Ok(()) + } + + pub fn delete_path(&mut self, path: &Path, recursive: bool) -> io::Result<()> { + let path = canonicalize(path); + let is_dir = path.is_dir(); + let language_servers: Vec<_> = self + .language_servers + .iter_clients() + .filter(|client| client.is_initialized()) + .cloned() + .collect(); + for language_server in language_servers { + let Some(request) = language_server.will_delete(&path, is_dir) else { + continue; + }; + let edit = match helix_lsp::block_on(request) { + Ok(edit) => edit.unwrap_or_default(), + Err(err) => { + log::error!("invalid willDelete response: {err:?}"); + continue; + } + }; + if let Err(err) = self.apply_workspace_edit(language_server.offset_encoding(), &edit) { + log::error!("failed to apply workspace edit: {err:?}") + } + } + + if is_dir { + if recursive { + fs::remove_dir_all(&path)?; + } else { + fs::remove_dir(&path)?; + } + } else { + fs::remove_file(&path)?; + } + + for ls in self.language_servers.iter_clients() { + if !ls.is_initialized() { + continue; + } + ls.did_delete(&path, is_dir); + } + self.language_servers.file_event_handler.file_changed(path); + Ok(()) + } + pub fn set_doc_path(&mut self, doc_id: DocumentId, path: &Path) { let doc = doc_mut!(self, &doc_id); let old_path = doc.path(); |