Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-core/src/diagnostic.rs')
-rw-r--r--helix-core/src/diagnostic.rs19
1 files changed, 17 insertions, 2 deletions
diff --git a/helix-core/src/diagnostic.rs b/helix-core/src/diagnostic.rs
index ba7df1b0..b9360b52 100644
--- a/helix-core/src/diagnostic.rs
+++ b/helix-core/src/diagnostic.rs
@@ -1,5 +1,5 @@
//! LSP diagnostic utility types.
-use std::fmt;
+use std::{fmt, sync::Arc};
pub use helix_stdx::range::Range;
use serde::{Deserialize, Serialize};
@@ -50,9 +50,24 @@ pub struct Diagnostic {
pub data: Option<serde_json::Value>,
}
+/// The source of a diagnostic.
+///
+/// This type is cheap to clone: all data is either `Copy` or wrapped in an `Arc`.
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub enum DiagnosticProvider {
- Lsp { server_id: LanguageServerId },
+ Lsp {
+ /// The ID of the language server which sent the diagnostic.
+ server_id: LanguageServerId,
+ /// An optional identifier under which diagnostics are managed by the client.
+ ///
+ /// `identifier` is a field from the LSP "Pull Diagnostics" feature meant to provide an
+ /// optional "namespace" for diagnostics: a language server can respond to a diagnostics
+ /// pull request with an identifier and these diagnostics should be treated as separate
+ /// from push diagnostics. Rust-analyzer uses this feature for example to provide Cargo
+ /// diagnostics with push and internal diagnostics with pull. The push diagnostics should
+ /// not clear the pull diagnostics and vice-versa.
+ identifier: Option<Arc<str>>,
+ },
// Future internal features can go here...
}