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.rs90
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();