summaryrefslogtreecommitdiff
path: root/helix-term/src/application.rs
diff options
context:
space:
mode:
authorPascal Kuthe2024-01-28 16:34:45 +0000
committerGitHub2024-01-28 16:34:45 +0000
commit87a720c3a13ccc7245f5b0befc008db5bd039032 (patch)
treee0e3f91c516a10d154cd01861e96ae0f50ea3cad /helix-term/src/application.rs
parentf5b67d9acb89ea54e7226111e3e4d8c3a008144b (diff)
make path changes LSP spec conform (#8949)
Currently, helix implements operations which change the paths of files incorrectly and inconsistently. This PR ensures that we do the following whenever a buffer is renamed (`:move` and workspace edits) * always send did_open/did_close notifications * send will_rename/did_rename requests correctly * send them to all LSP servers not just those that are active for a buffer * also send these requests for paths that are not yet open in a buffer (if triggered from workspace edit). * only send these if the server registered interests in the path * autodetect language, indent, line ending, .. This PR also centralizes the infrastructure for path setting and therefore `:w <path>` benefits from similar fixed (but without didRename)
Diffstat (limited to 'helix-term/src/application.rs')
-rw-r--r--helix-term/src/application.rs31
1 files changed, 5 insertions, 26 deletions
diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs
index 3f3e59c6..b5150a13 100644
--- a/helix-term/src/application.rs
+++ b/helix-term/src/application.rs
@@ -21,7 +21,6 @@ use tui::backend::Backend;
use crate::{
args::Args,
- commands::apply_workspace_edit,
compositor::{Compositor, Event},
config::Config,
handlers,
@@ -573,26 +572,8 @@ impl Application {
let lines = doc_save_event.text.len_lines();
let bytes = doc_save_event.text.len_bytes();
- if doc.path() != Some(&doc_save_event.path) {
- doc.set_path(Some(&doc_save_event.path));
-
- let loader = self.editor.syn_loader.clone();
-
- // borrowing the same doc again to get around the borrow checker
- let doc = doc_mut!(self.editor, &doc_save_event.doc_id);
- let id = doc.id();
- doc.detect_language(loader);
- self.editor.refresh_language_servers(id);
- // and again a borrow checker workaround...
- let doc = doc_mut!(self.editor, &doc_save_event.doc_id);
- let diagnostics = Editor::doc_diagnostics(
- &self.editor.language_servers,
- &self.editor.diagnostics,
- doc,
- );
- doc.replace_diagnostics(diagnostics, &[], None);
- }
-
+ self.editor
+ .set_doc_path(doc_save_event.doc_id, &doc_save_event.path);
// TODO: fix being overwritten by lsp
self.editor.set_status(format!(
"'{}' written, {}L {}B",
@@ -1011,11 +992,9 @@ impl Application {
let language_server = language_server!();
if language_server.is_initialized() {
let offset_encoding = language_server.offset_encoding();
- let res = apply_workspace_edit(
- &mut self.editor,
- offset_encoding,
- &params.edit,
- );
+ let res = self
+ .editor
+ .apply_workspace_edit(offset_encoding, &params.edit);
Ok(json!(lsp::ApplyWorkspaceEditResponse {
applied: res.is_ok(),