Fix hover types for for-loops
This commit is contained in:
parent
3f6d26679d
commit
658450993a
18
Cargo.lock
generated
18
Cargo.lock
generated
@ -662,15 +662,7 @@ dependencies = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "reid-lib"
|
name = "reid-language-server"
|
||||||
version = "1.0.0-beta.3"
|
|
||||||
dependencies = [
|
|
||||||
"llvm-sys",
|
|
||||||
"thiserror",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "reid-lsp"
|
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dashmap 6.1.0",
|
"dashmap 6.1.0",
|
||||||
@ -680,6 +672,14 @@ dependencies = [
|
|||||||
"tower-lsp",
|
"tower-lsp",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "reid-lib"
|
||||||
|
version = "1.0.0-beta.3"
|
||||||
|
dependencies = [
|
||||||
|
"llvm-sys",
|
||||||
|
"thiserror",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustc-demangle"
|
name = "rustc-demangle"
|
||||||
version = "0.1.26"
|
version = "0.1.26"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "reid-lsp"
|
name = "reid-language-server"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|
||||||
|
@ -108,10 +108,10 @@ impl LanguageServer for Backend {
|
|||||||
if let Some(ty) = possible_ty.clone() {
|
if let Some(ty) = possible_ty.clone() {
|
||||||
(Some(range), format!("{}", ty))
|
(Some(range), format!("{}", ty))
|
||||||
} else {
|
} else {
|
||||||
(Some(range), String::from("no type"))
|
(Some(range), String::from("None type"))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
(None, String::from("no token"))
|
(None, String::from("no type"))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
(None, String::from("no token"))
|
(None, String::from("no token"))
|
||||||
@ -267,7 +267,10 @@ async fn main() {
|
|||||||
pub fn find_type_in_context(module: &mir::Module, token_idx: usize) -> Option<TypeKind> {
|
pub fn find_type_in_context(module: &mir::Module, token_idx: usize) -> Option<TypeKind> {
|
||||||
for import in &module.imports {
|
for import in &module.imports {
|
||||||
if import.1.contains(token_idx) {
|
if import.1.contains(token_idx) {
|
||||||
return None;
|
return Some(TypeKind::CustomType(mir::CustomTypeKey(
|
||||||
|
"d".to_owned(),
|
||||||
|
SourceModuleId(1),
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for typedef in &module.typedefs {
|
for typedef in &module.typedefs {
|
||||||
@ -342,7 +345,7 @@ pub fn find_type_in_context(module: &mir::Module, token_idx: usize) -> Option<Ty
|
|||||||
|
|
||||||
pub fn find_type_in_block(block: &mir::Block, module_id: SourceModuleId, token_idx: usize) -> Option<TypeKind> {
|
pub fn find_type_in_block(block: &mir::Block, module_id: SourceModuleId, token_idx: usize) -> Option<TypeKind> {
|
||||||
if !block.meta.contains(token_idx) {
|
if !block.meta.contains(token_idx) {
|
||||||
return None;
|
return Some(TypeKind::Bool);
|
||||||
}
|
}
|
||||||
|
|
||||||
for statement in &block.statements {
|
for statement in &block.statements {
|
||||||
@ -479,7 +482,10 @@ pub fn find_type_in_expr(expr: &mir::Expression, module_id: SourceModuleId, toke
|
|||||||
{
|
{
|
||||||
Some(*inner.clone())
|
Some(*inner.clone())
|
||||||
} else {
|
} else {
|
||||||
None
|
Some(TypeKind::CustomType(mir::CustomTypeKey(
|
||||||
|
"ä".to_owned(),
|
||||||
|
SourceModuleId(1),
|
||||||
|
)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mir::ExprKind::CastTo(expression, type_kind) => {
|
mir::ExprKind::CastTo(expression, type_kind) => {
|
||||||
|
@ -228,33 +228,34 @@ impl ast::Block {
|
|||||||
StmtKind::Let(counter_var.clone(), true, start.process(module_id)),
|
StmtKind::Let(counter_var.clone(), true, start.process(module_id)),
|
||||||
counter_range.as_meta(module_id),
|
counter_range.as_meta(module_id),
|
||||||
);
|
);
|
||||||
|
let statement_range = counter_range.clone() + start.1 + end.1 + block.2;
|
||||||
|
|
||||||
let set_new = mir::Statement(
|
let set_new = mir::Statement(
|
||||||
StmtKind::Set(
|
StmtKind::Set(
|
||||||
mir::Expression(
|
mir::Expression(
|
||||||
mir::ExprKind::Variable(counter_var.clone()),
|
mir::ExprKind::Variable(counter_var.clone()),
|
||||||
counter_range.as_meta(module_id),
|
(start.1 + end.1).as_meta(module_id),
|
||||||
),
|
),
|
||||||
mir::Expression(
|
mir::Expression(
|
||||||
mir::ExprKind::BinOp(
|
mir::ExprKind::BinOp(
|
||||||
mir::BinaryOperator::Add,
|
mir::BinaryOperator::Add,
|
||||||
Box::new(mir::Expression(
|
Box::new(mir::Expression(
|
||||||
mir::ExprKind::Variable(counter_var.clone()),
|
mir::ExprKind::Variable(counter_var.clone()),
|
||||||
counter_range.as_meta(module_id),
|
(start.1 + end.1).as_meta(module_id),
|
||||||
)),
|
)),
|
||||||
Box::new(mir::Expression(
|
Box::new(mir::Expression(
|
||||||
mir::ExprKind::Literal(mir::Literal::Vague(mir::VagueLiteral::Number(1))),
|
mir::ExprKind::Literal(mir::Literal::Vague(mir::VagueLiteral::Number(1))),
|
||||||
counter_range.as_meta(module_id),
|
(start.1 + end.1).as_meta(module_id),
|
||||||
)),
|
)),
|
||||||
mir::TypeKind::Vague(mir::VagueType::Unknown),
|
mir::TypeKind::Vague(mir::VagueType::Unknown),
|
||||||
),
|
),
|
||||||
counter_range.as_meta(module_id),
|
(start.1 + end.1).as_meta(module_id),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
counter_range.as_meta(module_id),
|
(start.1 + end.1).as_meta(module_id),
|
||||||
);
|
);
|
||||||
let mut block = block.into_mir(module_id);
|
let mut mir_block = block.into_mir(module_id);
|
||||||
block.statements.push(set_new);
|
mir_block.statements.push(set_new);
|
||||||
let while_statement = mir::Statement(
|
let while_statement = mir::Statement(
|
||||||
StmtKind::While(WhileStatement {
|
StmtKind::While(WhileStatement {
|
||||||
condition: mir::Expression(
|
condition: mir::Expression(
|
||||||
@ -262,28 +263,28 @@ impl ast::Block {
|
|||||||
mir::BinaryOperator::Cmp(mir::CmpOperator::LT),
|
mir::BinaryOperator::Cmp(mir::CmpOperator::LT),
|
||||||
Box::new(mir::Expression(
|
Box::new(mir::Expression(
|
||||||
mir::ExprKind::Variable(counter_var),
|
mir::ExprKind::Variable(counter_var),
|
||||||
counter_range.as_meta(module_id),
|
(start.1 + end.1).as_meta(module_id),
|
||||||
)),
|
)),
|
||||||
Box::new(end.process(module_id)),
|
Box::new(end.process(module_id)),
|
||||||
mir::TypeKind::Vague(mir::VagueType::Unknown),
|
mir::TypeKind::Vague(mir::VagueType::Unknown),
|
||||||
),
|
),
|
||||||
counter_range.as_meta(module_id),
|
(start.1 + end.1).as_meta(module_id),
|
||||||
),
|
),
|
||||||
block,
|
block: mir_block.clone(),
|
||||||
meta: self.2.as_meta(module_id),
|
meta: (start.1 + end.1 + block.2).as_meta(module_id),
|
||||||
}),
|
}),
|
||||||
self.2.as_meta(module_id),
|
(start.1 + end.1 + block.2).as_meta(module_id),
|
||||||
);
|
);
|
||||||
|
|
||||||
let inner_scope = StmtKind::Expression(mir::Expression(
|
let inner_scope = StmtKind::Expression(mir::Expression(
|
||||||
mir::ExprKind::Block(mir::Block {
|
mir::ExprKind::Block(mir::Block {
|
||||||
statements: vec![let_statement, while_statement],
|
statements: vec![let_statement, while_statement],
|
||||||
return_expression: None,
|
return_expression: None,
|
||||||
meta: counter_range.as_meta(module_id) + end.1.as_meta(module_id),
|
meta: statement_range.as_meta(module_id),
|
||||||
}),
|
}),
|
||||||
counter_range.as_meta(module_id) + end.1.as_meta(module_id),
|
statement_range.as_meta(module_id),
|
||||||
));
|
));
|
||||||
(inner_scope, self.2)
|
(inner_scope, statement_range)
|
||||||
}
|
}
|
||||||
ast::BlockLevelStatement::WhileLoop(expression, block) => (
|
ast::BlockLevelStatement::WhileLoop(expression, block) => (
|
||||||
StmtKind::While(WhileStatement {
|
StmtKind::While(WhileStatement {
|
||||||
@ -291,7 +292,7 @@ impl ast::Block {
|
|||||||
block: block.into_mir(module_id),
|
block: block.into_mir(module_id),
|
||||||
meta: self.2.as_meta(module_id),
|
meta: self.2.as_meta(module_id),
|
||||||
}),
|
}),
|
||||||
self.2,
|
expression.1 + block.2,
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user