use tower_lsp::jsonrpc::Result; use tower_lsp::lsp_types::*; use tower_lsp::{Client, LanguageServer, LspService, Server}; #[derive(Debug)] struct Backend { client: Client, } #[tower_lsp::async_trait] impl LanguageServer for Backend { async fn initialize(&self, _: InitializeParams) -> Result { let mut res = InitializeResult::default(); res.capabilities.completion_provider = Some(CompletionOptions { resolve_provider: None, trigger_characters: None, all_commit_characters: None, work_done_progress_options: WorkDoneProgressOptions { work_done_progress: None, }, completion_item: None, }); Ok(res) } async fn initialized(&self, _: InitializedParams) { self.client .log_message(MessageType::INFO, "server initialized!") .await; } async fn completion(&self, _params: CompletionParams) -> Result> { self.client .log_message(MessageType::INFO, "getting completion") .await; Ok(Some(CompletionResponse::Array(vec![ CompletionItem::new_simple("new".to_string(), "The new keyword".to_string()), ]))) } async fn shutdown(&self) -> Result<()> { Ok(()) } } #[tokio::main] pub async fn start() { let stdin = tokio::io::stdin(); let stdout = tokio::io::stdout(); let (service, socket) = LspService::new(|client| Backend { client }); Server::new(stdin, stdout, socket).serve(service).await; }