qlue-ls 3.2.1

A language server for SPARQL
Documentation
use std::rc::Rc;

use futures::lock::Mutex;
use ll_sparql_parser::ast::{AstNode, Prologue};

use crate::server::{
    Server,
    lsp::{
        FoldingRange, FoldingRangeKind, FoldingRangeRequest, FoldingRangeResponse,
        errors::LSPError, textdocument::Range,
    },
};

#[tracing::instrument(skip_all, fields(id = %request.get_id(), uri = %request.get_document_uri()))]
pub(super) async fn handle_folding_range_request(
    server_rc: Rc<Mutex<Server>>,
    request: FoldingRangeRequest,
) -> Result<(), LSPError> {
    let server = server_rc.lock().await;
    let mut result = vec![];
    let document = server.state.get_document(request.get_document_uri())?;
    let tree = server
        .state
        .get_cached_parse_tree(request.get_document_uri())?
        .tree;
    if let Some(prologue) = tree
        .first_child()
        .and_then(|child| child.first_child().and_then(Prologue::cast))
    {
        let range =
            Range::from_byte_offset_range(prologue.syntax().text_range(), &document.text).unwrap();
        result.push(FoldingRange {
            start_line: range.start.line,
            end_line: range.end.line,
            start_character: None,
            end_character: None,
            kind: Some(FoldingRangeKind::Imports),
            collapsed_text: Some(prologue.text()),
        });
    }
    let mut response = FoldingRangeResponse::new(request.get_id());
    response.set_result(result);
    server.send_message(response)
}