Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'lib/lsp-server/examples/minimal_lsp.rs')
-rw-r--r--lib/lsp-server/examples/minimal_lsp.rs105
1 files changed, 56 insertions, 49 deletions
diff --git a/lib/lsp-server/examples/minimal_lsp.rs b/lib/lsp-server/examples/minimal_lsp.rs
index b7dcef9bfa..5eef999e06 100644
--- a/lib/lsp-server/examples/minimal_lsp.rs
+++ b/lib/lsp-server/examples/minimal_lsp.rs
@@ -67,15 +67,6 @@
use std::{error::Error, io::Write};
-use lsp_types::{
- CompletionItem, CompletionItemKind, CompletionOptions, CompletionRequest, CompletionResponse,
- Contents, DefinitionRequest, Diagnostic, DiagnosticSeverity, DidChangeTextDocumentNotification,
- DidChangeTextDocumentParams, DidOpenTextDocumentNotification, DidOpenTextDocumentParams,
- DocumentFormattingParams, DocumentFormattingRequest, Hover, HoverProvider, HoverRequest,
- InitializeParams, LspNotificationMethod, LspRequestMethod, MarkedString, Notification,
- Position, PublishDiagnosticsNotification, PublishDiagnosticsParams, Range, Request,
- ServerCapabilities, TextDocumentSync, TextEdit, Uri,
-};
use rustc_hash::FxHashMap; // fast hash map
use std::process::Stdio;
use toolchain::command; // clippy-approved wrapper
@@ -83,6 +74,39 @@ use toolchain::command; // clippy-approved wrapper
#[allow(clippy::print_stderr, clippy::disallowed_types, clippy::disallowed_methods)]
use anyhow::{Context, Result, anyhow, bail};
use lsp_server::{Connection, Message, Request as ServerRequest, RequestId, Response};
+use lsp_types::notification::Notification as _; // for METHOD consts
+use lsp_types::request::Request as _;
+use lsp_types::{
+ CompletionItem,
+ CompletionItemKind,
+ // capability helpers
+ CompletionOptions,
+ CompletionResponse,
+ Diagnostic,
+ DiagnosticSeverity,
+ DidChangeTextDocumentParams,
+ DidOpenTextDocumentParams,
+ DocumentFormattingParams,
+ Hover,
+ HoverContents,
+ HoverProviderCapability,
+ // core
+ InitializeParams,
+ MarkedString,
+ OneOf,
+ Position,
+ PublishDiagnosticsParams,
+ Range,
+ ServerCapabilities,
+ TextDocumentSyncCapability,
+ TextDocumentSyncKind,
+ TextEdit,
+ Url,
+ // notifications
+ notification::{DidChangeTextDocument, DidOpenTextDocument, PublishDiagnostics},
+ // requests
+ request::{Completion, Formatting, GotoDefinition, HoverRequest},
+}; // for METHOD consts
// =====================================================================
// main
@@ -97,11 +121,11 @@ fn main() -> std::result::Result<(), Box<dyn Error + Sync + Send>> {
// advertised capabilities
let caps = ServerCapabilities {
- text_document_sync: Some(TextDocumentSync::Kind(lsp_types::TextDocumentSyncKind::Full)),
+ text_document_sync: Some(TextDocumentSyncCapability::Kind(TextDocumentSyncKind::FULL)),
completion_provider: Some(CompletionOptions::default()),
- definition_provider: Some(lsp_types::DefinitionProvider::Bool(true)),
- hover_provider: Some(HoverProvider::Bool(true)),
- document_formatting_provider: Some(lsp_types::DocumentFormattingProvider::Bool(true)),
+ definition_provider: Some(OneOf::Left(true)),
+ hover_provider: Some(HoverProviderCapability::Simple(true)),
+ document_formatting_provider: Some(OneOf::Left(true)),
..Default::default()
};
let init_value = serde_json::json!({
@@ -125,7 +149,7 @@ fn main_loop(
params: serde_json::Value,
) -> std::result::Result<(), Box<dyn Error + Sync + Send>> {
let _init: InitializeParams = serde_json::from_value(params)?;
- let mut docs: FxHashMap<Uri, String> = FxHashMap::default();
+ let mut docs: FxHashMap<Url, String> = FxHashMap::default();
for msg in &connection.receiver {
match msg {
@@ -155,25 +179,20 @@ fn main_loop(
fn handle_notification(
conn: &Connection,
note: &lsp_server::Notification,
- docs: &mut FxHashMap<Uri, String>,
+ docs: &mut FxHashMap<Url, String>,
) -> Result<()> {
- let method: LspNotificationMethod = note.method.clone().into();
- match method {
- DidOpenTextDocumentNotification::METHOD => {
+ match note.method.as_str() {
+ DidOpenTextDocument::METHOD => {
let p: DidOpenTextDocumentParams = serde_json::from_value(note.params.clone())?;
let uri = p.text_document.uri;
docs.insert(uri.clone(), p.text_document.text);
publish_dummy_diag(conn, &uri)?;
}
- DidChangeTextDocumentNotification::METHOD => {
+ DidChangeTextDocument::METHOD => {
let p: DidChangeTextDocumentParams = serde_json::from_value(note.params.clone())?;
if let Some(change) = p.content_changes.into_iter().next() {
- let uri = p.text_document.text_document_identifier.uri;
- let text = match change {
- lsp_types::TextDocumentContentChangeEvent::TextDocumentContentChangePartial(partial) => partial.text,
- lsp_types::TextDocumentContentChangeEvent::TextDocumentContentChangeWholeDocument(whole) => whole.text,
- };
- docs.insert(uri.clone(), text);
+ let uri = p.text_document.uri;
+ docs.insert(uri.clone(), change.text);
publish_dummy_diag(conn, &uri)?;
}
}
@@ -189,43 +208,31 @@ fn handle_notification(
fn handle_request(
conn: &Connection,
req: &ServerRequest,
- docs: &mut FxHashMap<Uri, String>,
+ docs: &mut FxHashMap<Url, String>,
) -> Result<()> {
- let parsed: LspRequestMethod = req.method.clone().into();
- match parsed {
- DefinitionRequest::METHOD => {
- send_ok(
- conn,
- req.id.clone(),
- &lsp_types::DefinitionResponse::DefinitionLinkList(Vec::new()),
- )?;
+ match req.method.as_str() {
+ GotoDefinition::METHOD => {
+ send_ok(conn, req.id.clone(), &lsp_types::GotoDefinitionResponse::Array(Vec::new()))?;
}
- CompletionRequest::METHOD => {
+ Completion::METHOD => {
let item = CompletionItem {
label: "HelloFromLSP".into(),
- kind: Some(CompletionItemKind::Function),
+ kind: Some(CompletionItemKind::FUNCTION),
detail: Some("dummy completion".into()),
..Default::default()
};
- let items = vec![item];
- let completion_list = CompletionResponse::CompletionList(lsp_types::CompletionList {
- is_incomplete: false,
- item_defaults: None,
- apply_kind: None,
- items,
- });
- send_ok(conn, req.id.clone(), &completion_list)?;
+ send_ok(conn, req.id.clone(), &CompletionResponse::Array(vec![item]))?;
}
HoverRequest::METHOD => {
let hover = Hover {
- contents: Contents::MarkedString(MarkedString::String(
+ contents: HoverContents::Scalar(MarkedString::String(
"Hello from *minimal_lsp*".into(),
)),
range: None,
};
send_ok(conn, req.id.clone(), &hover)?;
}
- DocumentFormattingRequest::METHOD => {
+ Formatting::METHOD => {
let p: DocumentFormattingParams = serde_json::from_value(req.params.clone())?;
let uri = p.text_document.uri;
let text = docs
@@ -248,10 +255,10 @@ fn handle_request(
// =====================================================================
// diagnostics
// =====================================================================
-fn publish_dummy_diag(conn: &Connection, uri: &Uri) -> Result<()> {
+fn publish_dummy_diag(conn: &Connection, uri: &Url) -> Result<()> {
let diag = Diagnostic {
range: Range::new(Position::new(0, 0), Position::new(0, 1)),
- severity: Some(DiagnosticSeverity::Information),
+ severity: Some(DiagnosticSeverity::INFORMATION),
code: None,
code_description: None,
source: Some("minimal_lsp".into()),
@@ -263,7 +270,7 @@ fn publish_dummy_diag(conn: &Connection, uri: &Uri) -> Result<()> {
let params =
PublishDiagnosticsParams { uri: uri.clone(), diagnostics: vec![diag], version: None };
conn.sender.send(Message::Notification(lsp_server::Notification::new(
- PublishDiagnosticsNotification::METHOD.into(),
+ PublishDiagnostics::METHOD.to_owned(),
params,
)))?;
Ok(())