Skip to content

Commit

Permalink
Diagnostics for open document as blocking event
Browse files Browse the repository at this point in the history
  • Loading branch information
SofusA committed Aug 17, 2024
1 parent 5a13b17 commit 44c5453
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 67 deletions.
4 changes: 0 additions & 4 deletions helix-term/src/handlers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ use crate::handlers::signature_help::SignatureHelpHandler;
pub use completion::trigger_auto_completion;
pub use helix_view::handlers::Handlers;

use self::diagnostics::PullDiagnosticsForDocumentsHandler;

mod auto_save;
pub mod completion;
mod diagnostics;
Expand All @@ -29,14 +27,12 @@ pub fn setup(config: Arc<ArcSwap<Config>>) -> Handlers {
let auto_save = AutoSaveHandler::new().spawn();
let pull_diagnostics_for_language_servers =
PullDiagnosticsForLanguageServersHandler::new().spawn();
let pull_diagnostics_for_documents = PullDiagnosticsForDocumentsHandler::new().spawn();

let handlers = Handlers {
completions,
signature_hints,
auto_save,
pull_diagnostics_for_language_servers,
pull_diagnostics_for_documents,
};

completion::register_hooks(&handlers);
Expand Down
74 changes: 16 additions & 58 deletions helix-term/src/handlers/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,7 @@ use helix_lsp::LanguageServerId;
use helix_view::document::Mode;
use helix_view::events::{DiagnosticsDidChange, DocumentDidChange, DocumentDidOpen};
use helix_view::handlers::diagnostics::DiagnosticEvent;
use helix_view::handlers::lsp::{
PullDiagnosticsForDocumentsEvent, PullDiagnosticsForLanguageServersEvent,
};
use helix_view::handlers::lsp::PullDiagnosticsForLanguageServersEvent;
use helix_view::handlers::Handlers;
use helix_view::{DocumentId, Editor};
use tokio::time::Instant;
Expand Down Expand Up @@ -54,18 +52,24 @@ pub(super) fn register_hooks(handlers: &Handlers) {
Ok(())
});

let tx = handlers.pull_diagnostics_for_documents.clone();
register_hook!(move |event: &mut DocumentDidOpen<'_>| {
if event
.doc
.has_language_server_with_feature(LanguageServerFeature::PullDiagnostics)
{
send_blocking(
&tx,
PullDiagnosticsForDocumentsEvent {
document_id: event.doc.id(),
},
);
let document_id = event.doc.id();
job::dispatch_blocking(move |editor, _| {
let Some(doc) = editor.document_mut(document_id) else {
return;
};

let language_servers =
doc.language_servers_with_feature(LanguageServerFeature::PullDiagnostics);

for language_server in language_servers {
pull_diagnostics_for_document(doc, language_server);
}
})
}

Ok(())
Expand All @@ -84,17 +88,6 @@ impl PullDiagnosticsForLanguageServersHandler {
}
}
}
pub(super) struct PullDiagnosticsForDocumentsHandler {
document_ids: HashSet<DocumentId>,
}

impl PullDiagnosticsForDocumentsHandler {
pub fn new() -> PullDiagnosticsForDocumentsHandler {
PullDiagnosticsForDocumentsHandler {
document_ids: [].into(),
}
}
}

impl helix_event::AsyncHook for PullDiagnosticsForLanguageServersHandler {
type Event = PullDiagnosticsForLanguageServersEvent;
Expand All @@ -116,41 +109,6 @@ impl helix_event::AsyncHook for PullDiagnosticsForLanguageServersHandler {
}
}

impl helix_event::AsyncHook for PullDiagnosticsForDocumentsHandler {
type Event = PullDiagnosticsForDocumentsEvent;

fn handle_event(
&mut self,
event: Self::Event,
_: Option<tokio::time::Instant>,
) -> Option<tokio::time::Instant> {
self.document_ids.insert(event.document_id);
Some(Instant::now() + Duration::from_millis(50))
}

fn finish_debounce(&mut self) {
let document_ids = self.document_ids.clone();
job::dispatch_blocking(move |editor, _| {
pull_diagnostics_for_documents(editor, document_ids)
})
}
}

fn pull_diagnostics_for_documents(editor: &mut Editor, document_ids: HashSet<DocumentId>) {
for document_id in document_ids {
let Some(doc) = editor.document_mut(document_id) else {
return;
};

let language_servers =
doc.language_servers_with_feature(LanguageServerFeature::PullDiagnostics);

for language_server in language_servers {
pull_diagnostics_for_document(doc, language_server);
}
}
}

fn pull_diagnostic_for_language_servers(
editor: &mut Editor,
language_server_ids: HashSet<LanguageServerId>,
Expand Down Expand Up @@ -209,7 +167,7 @@ fn handle_pull_diagnostics_response(
response: lsp::DocumentDiagnosticReport,
server_id: LanguageServerId,
uri: Uri,
document_id: helix_view::DocumentId,
document_id: DocumentId,
) {
let Some(doc) = editor.document_mut(document_id) else {
return;
Expand Down Expand Up @@ -263,7 +221,7 @@ fn add_diagnostics_to_editor(

fn handle_document_diagnostic_report_kind(
editor: &mut Editor,
document_id: helix_view::DocumentId,
document_id: DocumentId,
report: Option<HashMap<lsp::Url, lsp::DocumentDiagnosticReportKind>>,
server_id: LanguageServerId,
) {
Expand Down
1 change: 0 additions & 1 deletion helix-view/src/handlers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ pub struct Handlers {
pub signature_hints: Sender<lsp::SignatureHelpEvent>,
pub auto_save: Sender<AutoSaveEvent>,
pub pull_diagnostics_for_language_servers: Sender<lsp::PullDiagnosticsForLanguageServersEvent>,
pub pull_diagnostics_for_documents: Sender<lsp::PullDiagnosticsForDocumentsEvent>,
}

impl Handlers {
Expand Down
4 changes: 0 additions & 4 deletions helix-view/src/handlers/lsp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,6 @@ pub struct PullDiagnosticsForLanguageServersEvent {
pub language_server_ids: HashSet<helix_lsp::LanguageServerId>,
}

pub struct PullDiagnosticsForDocumentsEvent {
pub document_id: DocumentId,
}

#[derive(Debug)]
pub struct ApplyEditError {
pub kind: ApplyEditErrorKind,
Expand Down

0 comments on commit 44c5453

Please sign in to comment.