blues-lsp 0.1.0

LSP language server for the Bluespec SystemVerilog language
Documentation
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(&params.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 },
    ))
}