added more variable detections

This commit is contained in:
2024-06-08 18:59:46 +02:00
parent e82dae5dfc
commit ad00c78f0c
3 changed files with 116 additions and 12 deletions
+7 -1
View File
@@ -43,7 +43,7 @@ impl LspServer for Server {
); );
let mut completion_items: Vec<CompletionItem> = Vec::new(); let mut completion_items: Vec<CompletionItem> = Vec::new();
for (name, var) in items { 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 { match var.vtype {
VariableType::Func => { VariableType::Func => {
item.kind = Some(CompletionItemKind::FUNCTION); item.kind = Some(CompletionItemKind::FUNCTION);
@@ -54,6 +54,12 @@ impl LspServer for Server {
VariableType::Keyword => { VariableType::Keyword => {
item.kind = Some(CompletionItemKind::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.push(item);
} }
+73 -7
View File
@@ -1,6 +1,6 @@
use crate::{ use crate::{
lexer::{LexerState, Token, TokenType}, lexer::{LexerState, Token, TokenType},
variable::{Variable, VariableType}, variable::Variable,
}; };
use once_cell::sync::Lazy; use once_cell::sync::Lazy;
use regex::Regex; use regex::Regex;
@@ -73,7 +73,7 @@ pub struct Parser {
pub fn new_vars() -> HashMap<String, Variable> { pub fn new_vars() -> HashMap<String, Variable> {
HashMap::from([( HashMap::from([(
"void".to_string(), "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.tokens.push(self.tokens[index + 2].clone());
ast_res.ast_type = AstType::StructDeceleration; ast_res.ast_type = AstType::StructDeceleration;
self.index += 2; 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 } else if self.tokens.len() - index > 2
&& self.tokens[index].value == "namespace" && self.tokens[index].value == "namespace"
&& self.tokens[index + 1].token_type == TokenType::Identifier && 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.tokens.push(self.tokens[index + 2].clone());
ast_res.ast_type = AstType::Namespace; ast_res.ast_type = AstType::Namespace;
self.index += 2; 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 } else if self.tokens.len() - index > 2
&& self.tokens[index].value == "impl" && self.tokens[index].value == "impl"
&& self.tokens[index + 1].token_type == TokenType::Identifier && self.tokens[index + 1].token_type == TokenType::Identifier
@@ -177,17 +205,22 @@ impl Parser {
} else { } else {
ast_res.ast_type = AstType::FunctionDeceleration; 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.variables.insert(
self.tokens[index + 1].clone().value, self.tokens[index + 1].clone().value,
Variable::new_func( Variable::new_func(
VariableType::Func,
LexerState { LexerState {
line: self.tokens[index + 1].clone().line, line: self.tokens[index + 1].clone().line,
column: self.tokens[index + 1].clone().column, column: self.tokens[index + 1].clone().column,
}, },
desc,
), ),
); );
self.index += 3;
} else if self.tokens.len() - index > 1 } else if self.tokens.len() - index > 1
&& self.tokens[index + 1].token_type == TokenType::Curly && 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.tokens.push(self.tokens[index + 2].clone());
ast_res.ast_type = AstType::StructVar; ast_res.ast_type = AstType::StructVar;
self.index += 2; 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 { } else if self.tokens.len() - index > 1 {
if self.tokens[index + 1].token_type == TokenType::Identifier { if self.tokens[index + 1].token_type == TokenType::Identifier {
ast_res.tokens.push(self.tokens[index + 1].clone()); ast_res.tokens.push(self.tokens[index + 1].clone());
ast_res.ast_type = AstType::VariableDeceleration; ast_res.ast_type = AstType::VariableDeceleration;
self.index += 1; 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.variables.insert(
self.tokens[index + 1].clone().value, self.tokens[index + 1].clone().value,
Variable::new_var( Variable::new_var(
VariableType::Var,
LexerState { LexerState {
line: self.tokens[index + 1].clone().line, line: self.tokens[index + 1].clone().line,
column: self.tokens[index + 1].clone().column, column: self.tokens[index + 1].clone().column,
}, },
desc,
), ),
); );
} else if self.tokens.len() - index > 2 } else if self.tokens.len() - index > 2
@@ -227,14 +281,20 @@ impl Parser {
ast_res.tokens[0].value += ">"; ast_res.tokens[0].value += ">";
ast_res.ast_type = AstType::VariableDeceleration; ast_res.ast_type = AstType::VariableDeceleration;
self.index += 2; 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.variables.insert(
self.tokens[index + 1].clone().value, self.tokens[index + 1].clone().value,
Variable::new_var( Variable::new_var(
VariableType::Var,
LexerState { LexerState {
line: self.tokens[index + 1].clone().line, line: self.tokens[index + 1].clone().line,
column: self.tokens[index + 1].clone().column, column: self.tokens[index + 1].clone().column,
}, },
desc,
), ),
); );
} else if self.tokens.len() - index > 2 } else if self.tokens.len() - index > 2
@@ -244,14 +304,20 @@ impl Parser {
ast_res.tokens.push(self.tokens[index + 2].clone()); ast_res.tokens.push(self.tokens[index + 2].clone());
ast_res.ast_type = AstType::PointerDeceleration; ast_res.ast_type = AstType::PointerDeceleration;
self.index += 2; 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.variables.insert(
self.tokens[index + 1].clone().value, self.tokens[index + 1].clone().value,
Variable::new_var( Variable::new_var(
VariableType::Var,
LexerState { LexerState {
line: self.tokens[index + 1].clone().line, line: self.tokens[index + 1].clone().line,
column: self.tokens[index + 1].clone().column, column: self.tokens[index + 1].clone().column,
}, },
desc,
), ),
); );
} }
+36 -4
View File
@@ -5,27 +5,59 @@ pub enum VariableType {
Var, Var,
Func, Func,
Keyword, Keyword,
Struct,
Namespace,
} }
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct Variable { pub struct Variable {
pub vtype: VariableType, pub vtype: VariableType,
pub desc: String,
pub state: LexerState, pub state: LexerState,
pub params: Vec<[String; 2]>, pub params: Vec<[String; 2]>,
} }
impl Variable { impl Variable {
pub fn new_var(vtype: VariableType, state: LexerState) -> Variable { pub fn new_var(state: LexerState, desc: String) -> Variable {
Variable { Variable {
vtype, vtype: VariableType::Var,
desc,
state, state,
params: vec![], params: vec![],
} }
} }
pub fn new_func(vtype: VariableType, state: LexerState) -> Variable { pub fn new_namespace(state: LexerState, desc: String) -> Variable {
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, state,
params: vec![], params: vec![],
} }