From ad00c78f0cfd1144f84a7f0e05705a2447c59dd7 Mon Sep 17 00:00:00 2001 From: Leo Dev Date: Sat, 8 Jun 2024 18:59:46 +0200 Subject: [PATCH] added more variable detections --- src/lsp.rs | 8 ++++- src/parser.rs | 80 ++++++++++++++++++++++++++++++++++++++++++++----- src/variable.rs | 40 ++++++++++++++++++++++--- 3 files changed, 116 insertions(+), 12 deletions(-) diff --git a/src/lsp.rs b/src/lsp.rs index be81957..9e4a868 100644 --- a/src/lsp.rs +++ b/src/lsp.rs @@ -43,7 +43,7 @@ impl LspServer for Server { ); let mut completion_items: Vec = Vec::new(); for (name, var) in items { - let mut item = CompletionItem::new_simple(name, "mydetail".to_string()); + let mut item = CompletionItem::new_simple(name, var.desc); match var.vtype { VariableType::Func => { item.kind = Some(CompletionItemKind::FUNCTION); @@ -54,6 +54,12 @@ impl LspServer for Server { 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); } diff --git a/src/parser.rs b/src/parser.rs index 7080169..b0a5f81 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -1,6 +1,6 @@ use crate::{ lexer::{LexerState, Token, TokenType}, - variable::{Variable, VariableType}, + variable::Variable, }; use once_cell::sync::Lazy; use regex::Regex; @@ -73,7 +73,7 @@ pub struct Parser { pub fn new_vars() -> HashMap { HashMap::from([( "void".to_string(), - Variable::new_var(VariableType::Keyword, LexerState { line: 0, column: 0 }), + Variable::new_keyword(LexerState { line: 0, column: 0 }, String::from("")), )]) } @@ -124,6 +124,20 @@ impl Parser { ast_res.tokens.push(self.tokens[index + 2].clone()); ast_res.ast_type = AstType::StructDeceleration; self.index += 2; + let mut desc = String::new(); + if index > 0 && self.tokens[index - 1].token_type == TokenType::Comment { + desc = self.tokens[index - 1].value.clone() + } + self.variables.insert( + self.tokens[index + 1].clone().value, + Variable::new_struct( + LexerState { + line: self.tokens[index + 1].clone().line, + column: self.tokens[index + 1].clone().column, + }, + desc, + ), + ); } else if self.tokens.len() - index > 2 && self.tokens[index].value == "namespace" && self.tokens[index + 1].token_type == TokenType::Identifier @@ -133,6 +147,20 @@ impl Parser { ast_res.tokens.push(self.tokens[index + 2].clone()); ast_res.ast_type = AstType::Namespace; self.index += 2; + let mut desc = String::new(); + if index > 0 && self.tokens[index - 1].token_type == TokenType::Comment { + desc = self.tokens[index - 1].value.clone() + } + self.variables.insert( + self.tokens[index + 1].clone().value, + Variable::new_namespace( + LexerState { + line: self.tokens[index + 1].clone().line, + column: self.tokens[index + 1].clone().column, + }, + desc, + ), + ); } else if self.tokens.len() - index > 2 && self.tokens[index].value == "impl" && self.tokens[index + 1].token_type == TokenType::Identifier @@ -177,17 +205,22 @@ impl Parser { } else { ast_res.ast_type = AstType::FunctionDeceleration; } + self.index += 3; + let mut desc = String::new(); + if index > 0 && self.tokens[index - 1].token_type == TokenType::Comment + { + desc = self.tokens[index - 1].value.clone() + } self.variables.insert( self.tokens[index + 1].clone().value, Variable::new_func( - VariableType::Func, LexerState { line: self.tokens[index + 1].clone().line, column: self.tokens[index + 1].clone().column, }, + desc, ), ); - self.index += 3; } else if self.tokens.len() - index > 1 && self.tokens[index + 1].token_type == TokenType::Curly { @@ -202,19 +235,40 @@ impl Parser { ast_res.tokens.push(self.tokens[index + 2].clone()); ast_res.ast_type = AstType::StructVar; self.index += 2; + let mut desc = String::new(); + if index > 0 && self.tokens[index - 1].token_type == TokenType::Comment + { + desc = self.tokens[index - 1].value.clone() + } + self.variables.insert( + self.tokens[index + 1].clone().value, + Variable::new_var( + LexerState { + line: self.tokens[index + 1].clone().line, + column: self.tokens[index + 1].clone().column, + }, + desc, + ), + ); } else if self.tokens.len() - index > 1 { if self.tokens[index + 1].token_type == TokenType::Identifier { ast_res.tokens.push(self.tokens[index + 1].clone()); ast_res.ast_type = AstType::VariableDeceleration; self.index += 1; + let mut desc = String::new(); + if index > 0 + && self.tokens[index - 1].token_type == TokenType::Comment + { + desc = self.tokens[index - 1].value.clone() + } self.variables.insert( self.tokens[index + 1].clone().value, Variable::new_var( - VariableType::Var, LexerState { line: self.tokens[index + 1].clone().line, column: self.tokens[index + 1].clone().column, }, + desc, ), ); } else if self.tokens.len() - index > 2 @@ -227,14 +281,20 @@ impl Parser { ast_res.tokens[0].value += ">"; ast_res.ast_type = AstType::VariableDeceleration; self.index += 2; + let mut desc = String::new(); + if index > 0 + && self.tokens[index - 1].token_type == TokenType::Comment + { + desc = self.tokens[index - 1].value.clone() + } self.variables.insert( self.tokens[index + 1].clone().value, Variable::new_var( - VariableType::Var, LexerState { line: self.tokens[index + 1].clone().line, column: self.tokens[index + 1].clone().column, }, + desc, ), ); } else if self.tokens.len() - index > 2 @@ -244,14 +304,20 @@ impl Parser { ast_res.tokens.push(self.tokens[index + 2].clone()); ast_res.ast_type = AstType::PointerDeceleration; self.index += 2; + let mut desc = String::new(); + if index > 0 + && self.tokens[index - 1].token_type == TokenType::Comment + { + desc = self.tokens[index - 1].value.clone() + } self.variables.insert( self.tokens[index + 1].clone().value, Variable::new_var( - VariableType::Var, LexerState { line: self.tokens[index + 1].clone().line, column: self.tokens[index + 1].clone().column, }, + desc, ), ); } diff --git a/src/variable.rs b/src/variable.rs index 66ad012..d6c7245 100644 --- a/src/variable.rs +++ b/src/variable.rs @@ -5,27 +5,59 @@ pub enum VariableType { Var, Func, Keyword, + Struct, + Namespace, } #[derive(Clone, Debug)] pub struct Variable { pub vtype: VariableType, + pub desc: String, pub state: LexerState, pub params: Vec<[String; 2]>, } impl Variable { - pub fn new_var(vtype: VariableType, state: LexerState) -> Variable { + pub fn new_var(state: LexerState, desc: String) -> Variable { Variable { - vtype, + vtype: VariableType::Var, + desc, state, params: vec![], } } - pub fn new_func(vtype: VariableType, state: LexerState) -> Variable { + pub fn new_namespace(state: LexerState, desc: String) -> Variable { Variable { - vtype, + vtype: VariableType::Namespace, + desc, + state, + params: vec![], + } + } + + pub fn new_struct(state: LexerState, desc: String) -> Variable { + Variable { + vtype: VariableType::Struct, + desc, + state, + params: vec![], + } + } + + pub fn new_keyword(state: LexerState, desc: String) -> Variable { + Variable { + vtype: VariableType::Keyword, + desc, + state, + params: vec![], + } + } + + pub fn new_func(state: LexerState, desc: String) -> Variable { + Variable { + vtype: VariableType::Func, + desc, state, params: vec![], }