|
1 | 1 | mod documents; |
2 | | -mod notifier; |
3 | 2 | mod server; |
4 | 3 | mod tasks; |
5 | 4 |
|
6 | | -use crate::notifier::TowerLspNotifier; |
7 | | -use crate::server::{DjangoLanguageServer, LspNotification, LspRequest}; |
| 5 | +use crate::server::DjangoLanguageServer; |
8 | 6 | use anyhow::Result; |
9 | | -use server::LspResponse; |
10 | | -use std::sync::Arc; |
11 | | -use tokio::sync::RwLock; |
12 | | -use tower_lsp::jsonrpc::Result as LspResult; |
13 | | -use tower_lsp::lsp_types::*; |
14 | | -use tower_lsp::{LanguageServer, LspService, Server}; |
15 | | - |
16 | | -struct TowerLspBackend { |
17 | | - server: Arc<RwLock<DjangoLanguageServer>>, |
18 | | -} |
19 | | - |
20 | | -#[tower_lsp::async_trait] |
21 | | -impl LanguageServer for TowerLspBackend { |
22 | | - async fn initialize(&self, params: InitializeParams) -> LspResult<InitializeResult> { |
23 | | - match self |
24 | | - .server |
25 | | - .write() |
26 | | - .await |
27 | | - .handle_request(LspRequest::Initialize(params)) |
28 | | - .map_err(|_| tower_lsp::jsonrpc::Error::internal_error())? |
29 | | - { |
30 | | - LspResponse::Initialize(result) => Ok(result), |
31 | | - _ => Err(tower_lsp::jsonrpc::Error::internal_error()), |
32 | | - } |
33 | | - } |
34 | | - |
35 | | - async fn initialized(&self, params: InitializedParams) { |
36 | | - if let Err(e) = self |
37 | | - .server |
38 | | - .write() |
39 | | - .await |
40 | | - .handle_notification(LspNotification::Initialized(params)) |
41 | | - { |
42 | | - eprintln!("Error handling initialized: {}", e); |
43 | | - } |
44 | | - } |
45 | | - |
46 | | - async fn shutdown(&self) -> LspResult<()> { |
47 | | - self.server |
48 | | - .write() |
49 | | - .await |
50 | | - .handle_notification(LspNotification::Shutdown) |
51 | | - .map_err(|_| tower_lsp::jsonrpc::Error::internal_error()) |
52 | | - } |
53 | | - |
54 | | - async fn did_open(&self, params: DidOpenTextDocumentParams) { |
55 | | - if let Err(e) = self |
56 | | - .server |
57 | | - .write() |
58 | | - .await |
59 | | - .handle_notification(LspNotification::DidOpenTextDocument(params)) |
60 | | - { |
61 | | - eprintln!("Error handling document open: {}", e); |
62 | | - } |
63 | | - } |
64 | | - |
65 | | - async fn did_change(&self, params: DidChangeTextDocumentParams) { |
66 | | - if let Err(e) = self |
67 | | - .server |
68 | | - .write() |
69 | | - .await |
70 | | - .handle_notification(LspNotification::DidChangeTextDocument(params)) |
71 | | - { |
72 | | - eprintln!("Error handling document change: {}", e); |
73 | | - } |
74 | | - } |
75 | | - |
76 | | - async fn did_close(&self, params: DidCloseTextDocumentParams) { |
77 | | - if let Err(e) = self |
78 | | - .server |
79 | | - .write() |
80 | | - .await |
81 | | - .handle_notification(LspNotification::DidCloseTextDocument(params)) |
82 | | - { |
83 | | - eprintln!("Error handling document close: {}", e); |
84 | | - } |
85 | | - } |
86 | | - |
87 | | - async fn completion(&self, params: CompletionParams) -> LspResult<Option<CompletionResponse>> { |
88 | | - match self |
89 | | - .server |
90 | | - .write() |
91 | | - .await |
92 | | - .handle_request(LspRequest::Completion(params)) |
93 | | - .map_err(|_| tower_lsp::jsonrpc::Error::internal_error())? |
94 | | - { |
95 | | - LspResponse::Completion(result) => Ok(result), |
96 | | - _ => Err(tower_lsp::jsonrpc::Error::internal_error()), |
97 | | - } |
98 | | - } |
99 | | -} |
100 | 7 |
|
101 | 8 | pub async fn serve() -> Result<()> { |
102 | 9 | let stdin = tokio::io::stdin(); |
103 | 10 | let stdout = tokio::io::stdout(); |
104 | 11 |
|
105 | | - let (service, socket) = LspService::build(|client| { |
106 | | - let notifier = Box::new(TowerLspNotifier::new(client.clone())); |
107 | | - let server = DjangoLanguageServer::new(notifier); |
108 | | - TowerLspBackend { |
109 | | - server: Arc::new(RwLock::new(server)), |
110 | | - } |
111 | | - }) |
112 | | - .finish(); |
| 12 | + let (service, socket) = tower_lsp::LspService::build(DjangoLanguageServer::new).finish(); |
113 | 13 |
|
114 | | - Server::new(stdin, stdout, socket).serve(service).await; |
| 14 | + tower_lsp::Server::new(stdin, stdout, socket) |
| 15 | + .serve(service) |
| 16 | + .await; |
115 | 17 |
|
116 | 18 | Ok(()) |
117 | 19 | } |
0 commit comments