cairo-language-server 2.18.0

The Cairo Language Server
Documentation
use lsp_types::{
    ClientCapabilities, DocumentHighlight, DocumentHighlightClientCapabilities,
    DocumentHighlightParams, TextDocumentClientCapabilities, TextDocumentPositionParams,
    lsp_request,
};

use crate::support::cursor::render_selections_with_attrs;
use crate::support::transform::Transformer;

mod highlight;
mod macros;

impl Transformer for DocumentHighlight {
    fn capabilities(base: ClientCapabilities) -> ClientCapabilities {
        ClientCapabilities {
            text_document: base.text_document.or_else(Default::default).map(|it| {
                TextDocumentClientCapabilities {
                    references: Some(DocumentHighlightClientCapabilities {
                        dynamic_registration: Some(false),
                    }),
                    ..it
                }
            }),
            ..base
        }
    }

    fn transform(
        mut ls: crate::support::MockClient,
        cursors: crate::support::cursor::Cursors,
        _config: Option<serde_json::Value>,
    ) -> String {
        let cairo = ls.fixture.read_file("src/lib.cairo");
        let position = cursors.assert_single_caret();

        let params = DocumentHighlightParams {
            text_document_position_params: TextDocumentPositionParams {
                text_document: ls.doc_id("src/lib.cairo"),
                position,
            },
            work_done_progress_params: Default::default(),
            partial_result_params: Default::default(),
        };

        let highlights =
            ls.send_request::<lsp_request!("textDocument/documentHighlight")>(params).unwrap();
        let ranges = highlights.into_iter().map(|loc| (loc.range, None)).collect::<Vec<_>>();

        render_selections_with_attrs(&cairo, &ranges)
    }
}