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.rs | 105 |
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(()) |