gluon_language-server 0.9.2

Language server providing completion for gluon
use languageserver_types::{DocumentHighlight, TextDocumentPositionParams};

use super::*;

use completion;

pub fn register(io: &mut IoHandler, thread: &RootedThread) {
    let thread = thread.clone();
    let f = move |params: TextDocumentPositionParams| {
        retrieve_expr(&thread, &params.text_document.uri, |module| {
            let expr = &module.expr;

            let source = &module.source;

            let byte_index = position_to_byte_index(&source, &params.position)?;

            let symbol_spans = completion::find_all_symbols(source.span(), expr, byte_index)
                .map(|t| t.1)
                .unwrap_or(Vec::new());

            symbol_spans
                .into_iter()
                .map(|span| {
                    Ok(DocumentHighlight {
                        kind: None,
                        range: byte_span_to_range(&source, span)?,
                    })
                })
                .collect::<Result<_, _>>()
                .map(Some)
        })
    };
    io.add_async_method(request!("textDocument/documentHighlight"), f);
}