mirror of https://github.com/astral-sh/ruff
Fix missing diagnostics for notebooks (#21156)
This commit is contained in:
parent
4b758b3746
commit
4b026c2a55
|
|
@ -1,7 +1,4 @@
|
||||||
use lsp_types::Url;
|
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
Session,
|
|
||||||
lint::DiagnosticsMap,
|
lint::DiagnosticsMap,
|
||||||
session::{Client, DocumentQuery, DocumentSnapshot},
|
session::{Client, DocumentQuery, DocumentSnapshot},
|
||||||
};
|
};
|
||||||
|
|
@ -22,21 +19,10 @@ pub(super) fn generate_diagnostics(snapshot: &DocumentSnapshot) -> DiagnosticsMa
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn publish_diagnostics_for_document(
|
pub(super) fn publish_diagnostics_for_document(
|
||||||
session: &Session,
|
snapshot: &DocumentSnapshot,
|
||||||
url: &Url,
|
|
||||||
client: &Client,
|
client: &Client,
|
||||||
) -> crate::server::Result<()> {
|
) -> crate::server::Result<()> {
|
||||||
// Publish diagnostics if the client doesn't support pull diagnostics
|
for (uri, diagnostics) in generate_diagnostics(snapshot) {
|
||||||
if session.resolved_client_capabilities().pull_diagnostics {
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
|
|
||||||
let snapshot = session
|
|
||||||
.take_snapshot(url.clone())
|
|
||||||
.ok_or_else(|| anyhow::anyhow!("Unable to take snapshot for document with URL {url}"))
|
|
||||||
.with_failure_code(lsp_server::ErrorCode::InternalError)?;
|
|
||||||
|
|
||||||
for (uri, diagnostics) in generate_diagnostics(&snapshot) {
|
|
||||||
client
|
client
|
||||||
.send_notification::<lsp_types::notification::PublishDiagnostics>(
|
.send_notification::<lsp_types::notification::PublishDiagnostics>(
|
||||||
lsp_types::PublishDiagnosticsParams {
|
lsp_types::PublishDiagnosticsParams {
|
||||||
|
|
@ -52,14 +38,9 @@ pub(super) fn publish_diagnostics_for_document(
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn clear_diagnostics_for_document(
|
pub(super) fn clear_diagnostics_for_document(
|
||||||
session: &Session,
|
|
||||||
query: &DocumentQuery,
|
query: &DocumentQuery,
|
||||||
client: &Client,
|
client: &Client,
|
||||||
) -> crate::server::Result<()> {
|
) -> crate::server::Result<()> {
|
||||||
if session.resolved_client_capabilities().pull_diagnostics {
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
|
|
||||||
client
|
client
|
||||||
.send_notification::<lsp_types::notification::PublishDiagnostics>(
|
.send_notification::<lsp_types::notification::PublishDiagnostics>(
|
||||||
lsp_types::PublishDiagnosticsParams {
|
lsp_types::PublishDiagnosticsParams {
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,11 @@ impl super::SyncNotificationHandler for DidChange {
|
||||||
.update_text_document(&key, content_changes, new_version)
|
.update_text_document(&key, content_changes, new_version)
|
||||||
.with_failure_code(ErrorCode::InternalError)?;
|
.with_failure_code(ErrorCode::InternalError)?;
|
||||||
|
|
||||||
publish_diagnostics_for_document(session, &key.into_url(), client)?;
|
// Publish diagnostics if the client doesn't support pull diagnostics
|
||||||
|
if !session.resolved_client_capabilities().pull_diagnostics {
|
||||||
|
let snapshot = session.take_snapshot(key.into_url()).unwrap();
|
||||||
|
publish_diagnostics_for_document(&snapshot, client)?;
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,10 @@ impl super::SyncNotificationHandler for DidChangeNotebook {
|
||||||
.with_failure_code(ErrorCode::InternalError)?;
|
.with_failure_code(ErrorCode::InternalError)?;
|
||||||
|
|
||||||
// publish new diagnostics
|
// publish new diagnostics
|
||||||
publish_diagnostics_for_document(session, &key.into_url(), client)?;
|
let snapshot = session
|
||||||
|
.take_snapshot(key.into_url())
|
||||||
|
.expect("snapshot should be available");
|
||||||
|
publish_diagnostics_for_document(&snapshot, client)?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,13 +31,19 @@ impl super::SyncNotificationHandler for DidChangeWatchedFiles {
|
||||||
} else {
|
} else {
|
||||||
// publish diagnostics for text documents
|
// publish diagnostics for text documents
|
||||||
for url in session.text_document_urls() {
|
for url in session.text_document_urls() {
|
||||||
publish_diagnostics_for_document(session, url, client)?;
|
let snapshot = session
|
||||||
|
.take_snapshot(url.clone())
|
||||||
|
.expect("snapshot should be available");
|
||||||
|
publish_diagnostics_for_document(&snapshot, client)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// always publish diagnostics for notebook files (since they don't use pull diagnostics)
|
// always publish diagnostics for notebook files (since they don't use pull diagnostics)
|
||||||
for url in session.notebook_document_urls() {
|
for url in session.notebook_document_urls() {
|
||||||
publish_diagnostics_for_document(session, url, client)?;
|
let snapshot = session
|
||||||
|
.take_snapshot(url.clone())
|
||||||
|
.expect("snapshot should be available");
|
||||||
|
publish_diagnostics_for_document(&snapshot, client)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ impl super::SyncNotificationHandler for DidClose {
|
||||||
);
|
);
|
||||||
return Ok(());
|
return Ok(());
|
||||||
};
|
};
|
||||||
clear_diagnostics_for_document(session, snapshot.query(), client)?;
|
clear_diagnostics_for_document(snapshot.query(), client)?;
|
||||||
|
|
||||||
session
|
session
|
||||||
.close_document(&key)
|
.close_document(&key)
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
use crate::TextDocument;
|
use crate::TextDocument;
|
||||||
use crate::server::Result;
|
use crate::server::Result;
|
||||||
|
use crate::server::api::LSPResult;
|
||||||
use crate::server::api::diagnostics::publish_diagnostics_for_document;
|
use crate::server::api::diagnostics::publish_diagnostics_for_document;
|
||||||
use crate::session::{Client, Session};
|
use crate::session::{Client, Session};
|
||||||
use lsp_types as types;
|
use lsp_types as types;
|
||||||
|
|
@ -29,7 +30,16 @@ impl super::SyncNotificationHandler for DidOpen {
|
||||||
|
|
||||||
session.open_text_document(uri.clone(), document);
|
session.open_text_document(uri.clone(), document);
|
||||||
|
|
||||||
publish_diagnostics_for_document(session, &uri, client)?;
|
// Publish diagnostics if the client doesn't support pull diagnostics
|
||||||
|
if !session.resolved_client_capabilities().pull_diagnostics {
|
||||||
|
let snapshot = session
|
||||||
|
.take_snapshot(uri.clone())
|
||||||
|
.ok_or_else(|| {
|
||||||
|
anyhow::anyhow!("Unable to take snapshot for document with URL {uri}")
|
||||||
|
})
|
||||||
|
.with_failure_code(lsp_server::ErrorCode::InternalError)?;
|
||||||
|
publish_diagnostics_for_document(&snapshot, client)?;
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,10 @@ impl super::SyncNotificationHandler for DidOpenNotebook {
|
||||||
session.open_notebook_document(uri.clone(), notebook);
|
session.open_notebook_document(uri.clone(), notebook);
|
||||||
|
|
||||||
// publish diagnostics
|
// publish diagnostics
|
||||||
publish_diagnostics_for_document(session, &uri, client)?;
|
let snapshot = session
|
||||||
|
.take_snapshot(uri)
|
||||||
|
.expect("snapshot should be available");
|
||||||
|
publish_diagnostics_for_document(&snapshot, client)?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue