emmylua_ls 0.15.0

A language server for emmylua.
Documentation
use lsp_types::{
    ClientCapabilities, DiagnosticOptions, DiagnosticServerCapabilities, DocumentDiagnosticParams,
    DocumentDiagnosticReport, DocumentDiagnosticReportResult, FullDocumentDiagnosticReport,
    RelatedFullDocumentDiagnosticReport, ServerCapabilities,
};
use tokio_util::sync::CancellationToken;

use crate::context::ServerContextSnapshot;

use super::RegisterCapabilities;

pub async fn on_pull_document_diagnostic(
    context: ServerContextSnapshot,
    params: DocumentDiagnosticParams,
    token: CancellationToken,
) -> DocumentDiagnosticReportResult {
    let uri = params.text_document.uri;
    let analysis = context.analysis().read().await;
    let Some(file_id) = analysis.get_file_id(&uri) else {
        return default_diagnostic_report();
    };

    let analysis = context.analysis().read().await;
    let diagnostics = analysis.diagnose_file(file_id, token).unwrap_or_default();

    DocumentDiagnosticReport::Full(RelatedFullDocumentDiagnosticReport {
        related_documents: None,
        full_document_diagnostic_report: FullDocumentDiagnosticReport {
            result_id: None,
            items: diagnostics,
        },
    })
    .into()
}

fn default_diagnostic_report() -> DocumentDiagnosticReportResult {
    DocumentDiagnosticReport::Full(RelatedFullDocumentDiagnosticReport {
        related_documents: None,
        full_document_diagnostic_report: FullDocumentDiagnosticReport {
            result_id: None,
            items: vec![],
        },
    })
    .into()
}

pub struct DocumentDiagnosticCapabilities;

impl RegisterCapabilities for DocumentDiagnosticCapabilities {
    fn register_capabilities(server_capabilities: &mut ServerCapabilities, _: &ClientCapabilities) {
        server_capabilities.diagnostic_provider =
            Some(DiagnosticServerCapabilities::Options(DiagnosticOptions {
                identifier: Some("EmmyLua".to_string()),
                inter_file_dependencies: false,
                workspace_diagnostics: false,
                ..Default::default()
            }))
    }
}