diff --git a/src/lsp.rs b/src/lsp.rs index 9e4a868..47fe3eb 100644 --- a/src/lsp.rs +++ b/src/lsp.rs @@ -1,7 +1,4 @@ -use crate::{ - lspcom::{get_completion, request_methods, LspServer, TextDocumentChangeParams}, - variable::VariableType, -}; +use crate::lspcom::{get_completion, get_items, request_methods, LspServer, TextDocumentChangeParams}; use lsp_types::*; use once_cell::sync::Lazy; use regex::Regex; @@ -36,34 +33,12 @@ impl LspServer for Server { .documents .get(params.text_document_position.text_document.uri.as_str()) .expect("err_textdoc"); - let items = get_completion( + let items: HashMap = get_completion( text.clone(), params.text_document_position.position.line as usize + 1, params.text_document_position.position.character as usize, ); - let mut completion_items: Vec = Vec::new(); - for (name, var) in items { - let mut item = CompletionItem::new_simple(name, var.desc); - match var.vtype { - VariableType::Func => { - item.kind = Some(CompletionItemKind::FUNCTION); - } - VariableType::Var => { - item.kind = Some(CompletionItemKind::VARIABLE); - } - VariableType::Keyword => { - item.kind = Some(CompletionItemKind::KEYWORD); - } - VariableType::Struct => { - item.kind = Some(CompletionItemKind::STRUCT); - } - VariableType::Namespace => { - item.kind = Some(CompletionItemKind::MODULE); - } - } - completion_items.push(item); - } - CompletionResponse::Array(completion_items) + CompletionResponse::Array(get_items(items, "".to_string())) } fn did_change(&mut self, params: TextDocumentChangeParams) { self.documents.insert(params.uri, params.text); diff --git a/src/lspcom.rs b/src/lspcom.rs index 2df459f..c6b6668 100644 --- a/src/lspcom.rs +++ b/src/lspcom.rs @@ -1,5 +1,11 @@ -use crate::{parser::new_vars, transpiler::Transpiler, variable::Variable}; -use lsp_types::{CompletionParams, CompletionResponse, InitializeResult}; +use crate::{ + parser::new_vars, + transpiler::Transpiler, + variable::{Variable, VariableType}, +}; +use lsp_types::{ + CompletionItem, CompletionItemKind, CompletionParams, CompletionResponse, InitializeResult, +}; use rand::{thread_rng, Rng}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; @@ -56,3 +62,40 @@ pub struct TextDocumentChangeParams { pub uri: String, pub text: String, } + +pub fn get_items( + items: HashMap, + lname: String, +) -> Vec { + let mut completion_items: Vec = Vec::new(); + for (name, var) in items { + let mut item = CompletionItem::new_simple(lname.clone() + &name, var.desc); + if var.vtype != VariableType::Func { + completion_items.extend(get_items(var.params, name + "::").iter().cloned()) + } else { + // item.documentation = Some(Documentation::MarkupContent(MarkupContent { + // kind: MarkupKind::Markdown, + // value: "Markup".to_string(), + // })); + } + match var.vtype { + VariableType::Func => { + item.kind = Some(CompletionItemKind::FUNCTION); + } + VariableType::Var => { + item.kind = Some(CompletionItemKind::VARIABLE); + } + VariableType::Keyword => { + item.kind = Some(CompletionItemKind::KEYWORD); + } + VariableType::Struct => { + item.kind = Some(CompletionItemKind::STRUCT); + } + VariableType::Namespace => { + item.kind = Some(CompletionItemKind::MODULE); + } + } + completion_items.push(item); + } + completion_items +} diff --git a/src/transpiler.rs b/src/transpiler.rs index 81a625e..ee6089b 100644 --- a/src/transpiler.rs +++ b/src/transpiler.rs @@ -172,7 +172,7 @@ impl Transpiler { .as_str(); result += "\n}\n"; let vvars = variables.clone(); - if let Some(v) = variables.get_mut(&ast.tokens[1].value) { + if let Some(v) = variables.get_mut(&ast.tokens[0].value) { for (name, var) in vars { if !(vvars.contains_key(&name)) { v.params.insert(