use crate::lsp::error::LspResult;
use crate::lsp::server::Server;
pub fn diagnostic_capabilities() -> lsp_types::DiagnosticServerCapabilities {
lsp_types::DiagnosticServerCapabilities::Options(lsp_types::DiagnosticOptions {
identifier: Some("blues-lsp".into()),
inter_file_dependencies: true,
workspace_diagnostics: true,
..Default::default()
})
}
pub fn document_diagnostic(
server: &mut Server,
params: lsp_types::DocumentDiagnosticParams,
) -> LspResult<lsp_types::DocumentDiagnosticReportResult> {
let pkg = server.uri_to_pkg(¶ms.text_document.uri)?;
let syntax = server.proj.syntax.get(&server.proj, pkg);
let items = syntax
.ctx
.diagnostics
.get()
.iter()
.map(|d| lsp_types::Diagnostic {
range: d.span.to_lsp(&syntax.ctx.origins.root()),
severity: Some(d.severity.to_lsp()),
source: Some(d.source.into()),
message: d.message.clone(),
..Default::default()
})
.collect::<Vec<_>>();
Ok(lsp_types::DocumentDiagnosticReportResult::Report(
lsp_types::DocumentDiagnosticReport::Full(lsp_types::RelatedFullDocumentDiagnosticReport {
related_documents: None,
full_document_diagnostic_report: lsp_types::FullDocumentDiagnosticReport {
result_id: None,
items,
},
}),
))
}
pub fn workspace_diagnostic(
server: &mut Server,
_params: lsp_types::WorkspaceDiagnosticParams,
) -> LspResult<lsp_types::WorkspaceDiagnosticReportResult> {
let items = server
.proj
.iter_packages()
.flat_map(|pkg| {
let s = server.proj.syntax.get(&server.proj, pkg);
let file = server.proj.get_pkg(pkg).file;
let uri = server.file_to_uri(file).ok()?;
Some(lsp_types::WorkspaceDocumentDiagnosticReport::Full(
lsp_types::WorkspaceFullDocumentDiagnosticReport {
uri,
version: None,
full_document_diagnostic_report: lsp_types::FullDocumentDiagnosticReport {
result_id: None,
items: s
.ctx
.diagnostics
.get()
.iter()
.map(|d| lsp_types::Diagnostic {
range: d.span.to_lsp(&s.ctx.origins.root()),
severity: Some(d.severity.to_lsp()),
source: Some(d.source.into()),
message: d.message.clone(),
..Default::default()
})
.collect(),
},
},
))
})
.collect::<Vec<_>>();
Ok(lsp_types::WorkspaceDiagnosticReportResult::Report(
lsp_types::WorkspaceDiagnosticReport { items },
))
}