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, 49 insertions, 56 deletions
diff --git a/lib/lsp-server/examples/minimal_lsp.rs b/lib/lsp-server/examples/minimal_lsp.rs
index 5eef999e06..b7dcef9bfa 100644
--- a/lib/lsp-server/examples/minimal_lsp.rs
+++ b/lib/lsp-server/examples/minimal_lsp.rs
@@ -67,6 +67,15 @@
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
@@ -74,39 +83,6 @@ 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
@@ -121,11 +97,11 @@ fn main() -> std::result::Result<(), Box<dyn Error + Sync + Send>> {
// advertised capabilities
let caps = ServerCapabilities {
- text_document_sync: Some(TextDocumentSyncCapability::Kind(TextDocumentSyncKind::FULL)),
+ text_document_sync: Some(TextDocumentSync::Kind(lsp_types::TextDocumentSyncKind::Full)),
completion_provider: Some(CompletionOptions::default()),
- definition_provider: Some(OneOf::Left(true)),
- hover_provider: Some(HoverProviderCapability::Simple(true)),
- document_formatting_provider: Some(OneOf::Left(true)),
+ definition_provider: Some(lsp_types::DefinitionProvider::Bool(true)),
+ hover_provider: Some(HoverProvider::Bool(true)),
+ document_formatting_provider: Some(lsp_types::DocumentFormattingProvider::Bool(true)),
..Default::default()
};
let init_value = serde_json::json!({
@@ -149,7 +125,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<Url, String> = FxHashMap::default();
+ let mut docs: FxHashMap<Uri, String> = FxHashMap::default();
for msg in &connection.receiver {
match msg {
@@ -179,20 +155,25 @@ fn main_loop(
fn handle_notification(
conn: &Connection,
note: &lsp_server::Notification,
- docs: &mut FxHashMap<Url, String>,
+ docs: &mut FxHashMap<Uri, String>,
) -> Result<()> {
- match note.method.as_str() {
- DidOpenTextDocument::METHOD => {
+ let method: LspNotificationMethod = note.method.clone().into();
+ match method {
+ DidOpenTextDocumentNotification::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)?;
}
- DidChangeTextDocument::METHOD => {
+ DidChangeTextDocumentNotification::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.uri;
- docs.insert(uri.clone(), change.text);
+ 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);
publish_dummy_diag(conn, &uri)?;
}
}
@@ -208,31 +189,43 @@ fn handle_notification(
fn handle_request(
conn: &Connection,
req: &ServerRequest,
- docs: &mut FxHashMap<Url, String>,
+ docs: &mut FxHashMap<Uri, String>,
) -> Result<()> {
- match req.method.as_str() {
- GotoDefinition::METHOD => {
- send_ok(conn, req.id.clone(), &lsp_types::GotoDefinitionResponse::Array(Vec::new()))?;
+ let parsed: LspRequestMethod = req.method.clone().into();
+ match parsed {
+ DefinitionRequest::METHOD => {
+ send_ok(
+ conn,
+ req.id.clone(),
+ &lsp_types::DefinitionResponse::DefinitionLinkList(Vec::new()),
+ )?;
}
- Completion::METHOD => {
+ CompletionRequest::METHOD => {
let item = CompletionItem {
label: "HelloFromLSP".into(),
- kind: Some(CompletionItemKind::FUNCTION),
+ kind: Some(CompletionItemKind::Function),
detail: Some("dummy completion".into()),
..Default::default()
};
- send_ok(conn, req.id.clone(), &CompletionResponse::Array(vec![item]))?;
+ 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)?;
}
HoverRequest::METHOD => {
let hover = Hover {
- contents: HoverContents::Scalar(MarkedString::String(
+ contents: Contents::MarkedString(MarkedString::String(
"Hello from *minimal_lsp*".into(),
)),
range: None,
};
send_ok(conn, req.id.clone(), &hover)?;
}
- Formatting::METHOD => {
+ DocumentFormattingRequest::METHOD => {
let p: DocumentFormattingParams = serde_json::from_value(req.params.clone())?;
let uri = p.text_document.uri;
let text = docs
@@ -255,10 +248,10 @@ fn handle_request(
// =====================================================================
// diagnostics
// =====================================================================
-fn publish_dummy_diag(conn: &Connection, uri: &Url) -> Result<()> {
+fn publish_dummy_diag(conn: &Connection, uri: &Uri) -> 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()),
@@ -270,7 +263,7 @@ fn publish_dummy_diag(conn: &Connection, uri: &Url) -> Result<()> {
let params =
PublishDiagnosticsParams { uri: uri.clone(), diagnostics: vec![diag], version: None };
conn.sender.send(Message::Notification(lsp_server::Notification::new(
- PublishDiagnostics::METHOD.to_owned(),
+ PublishDiagnosticsNotification::METHOD.into(),
params,
)))?;
Ok(())