use tokio;
use tower_lsp_server::lsp_types::*;
use crate::analysis::analyze_program;
use crate::backend::{Backend, parse_with_diagnostics};
impl Backend {
pub async fn analyze_document(&self, uri: &Uri, content: &str) {
let language = self.get_language().await;
let file_name = uri.path().to_string();
let content_owned = content.to_string();
let (diagnostics, program_opt) = tokio::task::spawn_blocking(move || {
parse_with_diagnostics(&content_owned, file_name, language)
})
.await
.unwrap_or_else(|_| {
(
vec![Diagnostic::new_simple(
Range::new(Position::new(0, 0), Position::new(0, 0)),
crate::backend::i18n::get_lsp_text("analysis_task_failed", language)
.to_string(),
)],
None,
)
});
if let Some(program) = program_opt
&& let Ok(symbol_table) =
tokio::task::spawn_blocking(move || analyze_program(&program)).await
{
match symbol_table {
Ok(table) => {
self.symbol_tables.insert(uri.clone(), table);
}
Err(_) => {
}
}
}
self.diagnostics.insert(uri.clone(), diagnostics.clone());
let _ = self
.client
.publish_diagnostics(uri.clone(), diagnostics, None)
.await;
}
}