add document store and support for didopen, didchange, and didclose (#11)

This commit is contained in:
Josh Thomas 2024-12-09 23:34:55 -06:00 committed by GitHub
parent 5971c23ace
commit 1799355e27
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 341 additions and 9 deletions

View file

@ -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();