mirror of
https://github.com/joshuadavidthomas/django-language-server.git
synced 2025-09-29 13:25:22 +00:00
add document store and support for didopen, didchange, and didclose (#11)
This commit is contained in:
parent
5971c23ace
commit
1799355e27
3 changed files with 341 additions and 9 deletions
|
@ -1,3 +1,4 @@
|
|||
mod documents;
|
||||
mod notifier;
|
||||
mod server;
|
||||
|
||||
|
@ -5,37 +6,77 @@ use crate::notifier::TowerLspNotifier;
|
|||
use crate::server::{DjangoLanguageServer, LspNotification, LspRequest};
|
||||
use anyhow::Result;
|
||||
use djls_django::DjangoProject;
|
||||
use std::sync::Arc;
|
||||
use tokio::sync::RwLock;
|
||||
use tower_lsp::jsonrpc::Result as LspResult;
|
||||
use tower_lsp::lsp_types::*;
|
||||
use tower_lsp::{LanguageServer, LspService, Server};
|
||||
|
||||
struct TowerLspBackend {
|
||||
server: DjangoLanguageServer,
|
||||
server: Arc<RwLock<DjangoLanguageServer>>,
|
||||
}
|
||||
|
||||
#[tower_lsp::async_trait]
|
||||
impl LanguageServer for TowerLspBackend {
|
||||
async fn initialize(&self, params: InitializeParams) -> LspResult<InitializeResult> {
|
||||
self.server
|
||||
.read()
|
||||
.await
|
||||
.handle_request(LspRequest::Initialize(params))
|
||||
.map_err(|_| tower_lsp::jsonrpc::Error::internal_error())
|
||||
}
|
||||
|
||||
async fn initialized(&self, params: InitializedParams) {
|
||||
if self
|
||||
if let Err(e) = self
|
||||
.server
|
||||
.write()
|
||||
.await
|
||||
.handle_notification(LspNotification::Initialized(params))
|
||||
.is_err()
|
||||
{
|
||||
// Handle error
|
||||
eprintln!("Error handling initialized: {}", e);
|
||||
}
|
||||
}
|
||||
|
||||
async fn shutdown(&self) -> LspResult<()> {
|
||||
self.server
|
||||
.write()
|
||||
.await
|
||||
.handle_notification(LspNotification::Shutdown)
|
||||
.map_err(|_| tower_lsp::jsonrpc::Error::internal_error())
|
||||
}
|
||||
|
||||
async fn did_open(&self, params: DidOpenTextDocumentParams) {
|
||||
if let Err(e) = self
|
||||
.server
|
||||
.write()
|
||||
.await
|
||||
.handle_notification(LspNotification::DidOpenTextDocument(params))
|
||||
{
|
||||
eprintln!("Error handling document open: {}", e);
|
||||
}
|
||||
}
|
||||
|
||||
async fn did_change(&self, params: DidChangeTextDocumentParams) {
|
||||
if let Err(e) = self
|
||||
.server
|
||||
.write()
|
||||
.await
|
||||
.handle_notification(LspNotification::DidChangeTextDocument(params))
|
||||
{
|
||||
eprintln!("Error handling document change: {}", e);
|
||||
}
|
||||
}
|
||||
|
||||
async fn did_close(&self, params: DidCloseTextDocumentParams) {
|
||||
if let Err(e) = self
|
||||
.server
|
||||
.write()
|
||||
.await
|
||||
.handle_notification(LspNotification::DidCloseTextDocument(params))
|
||||
{
|
||||
eprintln!("Error handling document close: {}", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
|
@ -48,7 +89,9 @@ async fn main() -> Result<()> {
|
|||
let (service, socket) = LspService::build(|client| {
|
||||
let notifier = Box::new(TowerLspNotifier::new(client.clone()));
|
||||
let server = DjangoLanguageServer::new(django, notifier);
|
||||
TowerLspBackend { server }
|
||||
TowerLspBackend {
|
||||
server: Arc::new(RwLock::new(server)),
|
||||
}
|
||||
})
|
||||
.finish();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue