blues-lsp 0.1.0

LSP language server for the Bluespec SystemVerilog language
Documentation
use lsp_types::{FoldingRange, StaticTextDocumentColorProviderOptions};

use crate::{
    lsp::{error::LspResult, server::Server},
    project::syntax::Syntax,
    syntax::{cst::kind::TreeKind, location::Span},
};

pub fn folding_range_capabilities() -> lsp_types::FoldingRangeProviderCapability {
    // lsp_types::FoldingRangeProviderCapability::Simple(true)
    lsp_types::FoldingRangeProviderCapability::Options(StaticTextDocumentColorProviderOptions {
        document_selector: Some(vec![lsp_types::DocumentFilter {
            language: Some("bsv".into()),
            scheme: None,
            pattern: None,
        }]),
        id: Some("blues-lsp".into()),
    })
}

pub fn folding_range(
    server: &mut Server,
    params: lsp_types::FoldingRangeParams,
) -> LspResult<Option<Vec<lsp_types::FoldingRange>>> {
    let pkg = server.uri_to_pkg(&params.text_document.uri)?;
    let proj = &server.proj;

    let syntax = proj.syntax.get(proj, pkg);

    let ranges = folding_spans(&syntax)
        .map(|s| {
            let range = s.to_lsp(&syntax.ctx.origins);

            FoldingRange {
                start_line: range.start.line,
                start_character: None,
                // start_character: Some(range.start.character),
                end_line: range.end.line,
                end_character: None,
                // end_character: Some(range.end.character),
                kind: None,
                collapsed_text: None,
            }
        })
        .collect();

    Ok(Some(ranges))
}

fn folding_spans(syntax: &Syntax) -> impl Iterator<Item = Span> {
    syntax.cst.iter().filter_map(|n| {
        use TreeKind::*;
        match n.open_kind()? {
            StmtModule
            | StmtMethod
            | StmtFunction
            | StmtInterface
            | StmtTypedef
            | StmtInstance
            | StmtTypeclass
            | StmtImport
            | StmtExport
            | StmtRule
            | StmtAction
            | StmtActionvalue
            | StmtBlock
            | StmtSeq
            | StmtPar
            | StmtBvi
            | StmtBdpi
            | BviInterface
            | Case
            | StmtSubinterface
            | InterfaceItemMethod
            | InterfaceItemSubinterface
            | InstanceModule
            | InstanceFunction
            | TypeclassModule
            | TypeclassFunction
            | ExprAction
            | ExprActionvalue
            | ExprRules
            | ExprBlock
            | ExprInterface
            | ExprModule
            | ExprStructInit
            | ExprSeq
            | ExprPar => n.span(&syntax.ctx.origins),
            _ => None,
        }
    })
}