gluon_language-server 0.2.0

Language server providing completion for gluon
Documentation

extern crate gluon_language_server;
extern crate languageserver_types;

extern crate jsonrpc_core;
extern crate serde_json;
extern crate serde;

mod support;

use std::io::Write;

use languageserver_types::{CompletionItem, CompletionItemKind, Position, TextDocumentIdentifier,
                           TextDocumentPositionParams};

fn completion<W: ?Sized>(stdin: &mut W, id: u64, uri: &str, position: Position)
    where W: Write,
{
    let hover = support::method_call("textDocument/completion",
                                     id,
                                     TextDocumentPositionParams {
                                         text_document: TextDocumentIdentifier { uri: uri.into() },
                                         position: position,
                                     });

    support::write_message(stdin, hover).unwrap();
}

#[test]
fn local_completion() {
    let completions: Vec<CompletionItem> = support::send_rpc(|mut stdin| {
        let text = r#"
let test = 2
let test1 = ""
te
"#;
        support::did_open(stdin, "test", text);

        completion(stdin,
                   1,
                   "test",
                   Position {
                       line: 3,
                       character: 2,
                   })
    });
    assert_eq!(completions,
               [CompletionItem {
                    label: "test".into(),
                    kind: Some(CompletionItemKind::Variable),
                    detail: Some("Int".into()),
                    ..CompletionItem::default()
                },
                CompletionItem {
                    label: "test1".into(),
                    kind: Some(CompletionItemKind::Variable),
                    detail: Some("String".into()),
                    ..CompletionItem::default()
                }]);
}

#[test]
fn prelude_completion() {
    let completions: Vec<CompletionItem> = support::send_rpc(|mut stdin| {
        support::did_open(stdin, "test", "no");

        completion(stdin,
                   1,
                   "test",
                   Position {
                       line: 0,
                       character: 1,
                   })
    });
    assert_eq!(completions,
               [CompletionItem {
                    label: "not".into(),
                    kind: Some(CompletionItemKind::Variable),
                    detail: Some("| False | True -> std.types.Bool".into()),
                    ..CompletionItem::default()
                }]);
}