feat: add asynchronous LSP plugin diagnostics and definitions

This commit is contained in:
Valdemar Lorenzen
2026-10-09 12:01:45 +02:00
parent e5d545a4ca
commit 92679ecbe1
14 changed files with 4828 additions and 109 deletions
+88
View File
@@ -0,0 +1,88 @@
use std::path::PathBuf;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Serialize)]
pub struct DocumentSnapshot {
pub id: usize,
pub revision: u64,
pub path: Option<String>,
pub root: String,
pub text: String,
}
#[derive(Clone, Copy, Debug, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum DocumentEventKind {
Open,
Change,
Save,
Close,
}
#[derive(Clone, Debug, Serialize)]
pub struct DocumentEvent {
pub event: DocumentEventKind,
pub document: DocumentSnapshot,
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum DiagnosticSeverity {
Error,
Warning,
Information,
Hint,
}
/// Zero-based extended-grapheme positions, independent of any server encoding.
#[derive(Clone, Copy, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd)]
#[serde(deny_unknown_fields)]
pub struct TextPosition {
pub row: usize,
pub column: usize,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Diagnostic {
pub start: TextPosition,
pub end: TextPosition,
pub severity: DiagnosticSeverity,
pub message: String,
}
#[derive(Debug, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case", deny_unknown_fields)]
pub enum UpdateEffect {
Diagnostics {
buffer_id: usize,
revision: u64,
items: Vec<Diagnostic>,
},
Navigate {
buffer_id: usize,
revision: u64,
path: PathBuf,
row: usize,
column: usize,
},
Message {
text: String,
},
}
#[derive(Debug)]
pub struct PluginUpdate {
pub request_id: Option<u64>,
pub effects: Vec<UpdateEffect>,
}
#[derive(Debug)]
pub enum PluginEvent {
Response {
id: u64,
effects: Vec<crate::editor::Effect>,
},
Update(PluginUpdate),
}