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::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(¶ms.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,
end_line: range.end.line,
end_character: None,
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,
}
})
}