gluon_language-server 0.9.2

Language server providing completion for gluon
extern crate gluon_language_server;
extern crate languageserver_types;

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

mod support;

use languageserver_types::*;

use support::{expect_notification, expect_response, hover};

const STREAM_SOURCE: &'static str = r#"
let prelude = import! "std/prelude.glu"
let { Num } = prelude
let { Option } = import! "std/option.glu"

rec
type Stream_ a =
    | Value a (Stream a)
    | Empty
type Stream a = Lazy (Stream_ a)
in

let from f : (Int -> Option a) -> Stream a =
        let from_ i =
                lazy (\_ ->
                    match f i with
                    | Some x -> Value x (from_ (i + 1))
                    | None -> Empty
                )
        in from_ 0

{ from }
"#;

#[test]
fn simple_hover() {
    support::send_rpc(|stdin, stdout| {
        let uri = "file:///c%3A/test/test.glu";
        support::did_open(stdin, uri, "123");

        let _: PublishDiagnosticsParams = expect_notification(&mut *stdout);

        hover(
            stdin,
            2,
            uri,
            Position {
                line: 0,
                character: 2,
            },
        );
        let hover: Hover = expect_response(stdout);

        assert_eq!(
            hover,
            Hover {
                contents: HoverContents::Scalar(MarkedString::String("Int".into())),
                range: Some(Range {
                    start: Position {
                        line: 0,
                        character: 0,
                    },
                    end: Position {
                        line: 0,
                        character: 3,
                    },
                }),
            }
        );
    });
}

#[test]
fn identifier() {
    support::send_rpc(|stdin, stdout| {
        let src = r#"
let test = 1
test
"#;
        support::did_open(stdin, "test", src);

        let _: PublishDiagnosticsParams = expect_notification(&mut *stdout);

        hover(
            stdin,
            2,
            "test",
            Position {
                line: 2,
                character: 2,
            },
        );

        let hover: Hover = expect_response(stdout);

        assert_eq!(
            hover,
            Hover {
                contents: HoverContents::Scalar(MarkedString::String("Int".into())),
                range: Some(Range {
                    start: Position {
                        line: 2,
                        character: 0,
                    },
                    end: Position {
                        line: 2,
                        character: 4,
                    },
                }),
            }
        );
    });
}

#[test]
fn stream() {
    support::send_rpc(|stdin, stdout| {
        support::did_open(stdin, "stream", STREAM_SOURCE);

        let _: PublishDiagnosticsParams = expect_notification(&mut *stdout);

        hover(
            stdin,
            2,
            "stream",
            Position {
                line: 15,
                character: 29,
            },
        );

        let hover: Option<Hover> = expect_response(stdout);

        assert_eq!(
            hover,
            Some(Hover {
                contents: HoverContents::Scalar(MarkedString::String("Int".into())),
                range: Some(Range {
                    start: Position {
                        line: 15,
                        character: 28,
                    },
                    end: Position {
                        line: 15,
                        character: 29,
                    },
                }),
            })
        );
    });
}