junolsp 0.1.5

Language Server for JunoLang
use tower_lsp::{ jsonrpc::Result, lsp_types::* };
use libjuno::{ BuiltinEnum, REGISTRY };
use crate::backend::Backend;

pub async fn completion(
    _backend: &Backend,
    _params: CompletionParams
) -> Result<Option<CompletionResponse>> {
    let mut items = keywords();
    items.append(&mut builtins());
    Ok(Some(CompletionResponse::Array(items)))
}

fn builtins() -> Vec<CompletionItem> {
    let mut items = vec![];

    for (name, i) in REGISTRY.entries().into_iter() {
        items.push(match i.declare {
            BuiltinEnum::Function { param_types: _, return_type: _ } =>
                CompletionItem {
                    label: (*name).into(),
                    kind: Some(CompletionItemKind::FUNCTION),
                    detail: Some("Builtin".into()),
                    ..Default::default()
                },
        });
    }
    items
}

fn keywords() -> Vec<CompletionItem> {
    vec![
        CompletionItem {
            label: "fn".into(),
            kind: Some(CompletionItemKind::KEYWORD),
            detail: Some("Function".into()),
            ..Default::default()
        },

        CompletionItem {
            label: "let".into(),
            kind: Some(CompletionItemKind::KEYWORD),
            detail: Some("Variable".into()),
            ..Default::default()
        },
        CompletionItem {
            label: "mut".into(),
            kind: Some(CompletionItemKind::KEYWORD),
            detail: Some("Variable".into()),
            ..Default::default()
        },
        CompletionItem {
            label: "if".into(),
            kind: Some(CompletionItemKind::KEYWORD),
            detail: Some("Variable".into()),
            ..Default::default()
        },
        CompletionItem {
            label: "else".into(),
            kind: Some(CompletionItemKind::KEYWORD),
            detail: Some("Variable".into()),
            ..Default::default()
        },
        CompletionItem {
            label: "while".into(),
            kind: Some(CompletionItemKind::KEYWORD),
            detail: Some("Variable".into()),
            ..Default::default()
        },
        CompletionItem {
            label: "for".into(),
            kind: Some(CompletionItemKind::KEYWORD),
            detail: Some("Variable".into()),
            ..Default::default()
        },
        CompletionItem {
            label: "return".into(),
            kind: Some(CompletionItemKind::KEYWORD),
            detail: Some("Variable".into()),
            ..Default::default()
        },
        CompletionItem {
            label: "break".into(),
            kind: Some(CompletionItemKind::KEYWORD),
            detail: Some("Variable".into()),
            ..Default::default()
        },
        CompletionItem {
            label: "continue".into(),
            kind: Some(CompletionItemKind::KEYWORD),
            detail: Some("Variable".into()),
            ..Default::default()
        },
        CompletionItem {
            label: "import".into(),
            kind: Some(CompletionItemKind::KEYWORD),
            detail: Some("Variable".into()),
            ..Default::default()
        },

        CompletionItem {
            label: "struct".into(),
            kind: Some(CompletionItemKind::KEYWORD),
            detail: Some("Struct".into()),
            ..Default::default()
        }
    ]
}