added more variable detections
This commit is contained in:
+7
-1
@@ -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
@@ -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
@@ -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![],
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user