Add types to hovers in LSP, fix around and add metas
This commit is contained in:
parent
7d3aaa143a
commit
b71c253942
@ -3,7 +3,10 @@ use std::path::PathBuf;
|
|||||||
|
|
||||||
use dashmap::DashMap;
|
use dashmap::DashMap;
|
||||||
use reid::ast::lexer::{FullToken, Position};
|
use reid::ast::lexer::{FullToken, Position};
|
||||||
use reid::mir::{self, Context, StructType, TypeKind};
|
use reid::mir::{
|
||||||
|
self, Context, FunctionCall, FunctionDefinition, FunctionParam, IfExpression, SourceModuleId, StructType, TypeKind,
|
||||||
|
WhileStatement,
|
||||||
|
};
|
||||||
use reid::{compile_module, parse_module, perform_all_passes};
|
use reid::{compile_module, parse_module, perform_all_passes};
|
||||||
use tower_lsp::jsonrpc::Result;
|
use tower_lsp::jsonrpc::Result;
|
||||||
use tower_lsp::lsp_types::{
|
use tower_lsp::lsp_types::{
|
||||||
@ -78,12 +81,6 @@ impl LanguageServer for Backend {
|
|||||||
let tokens = self.tokens.get(&file_name);
|
let tokens = self.tokens.get(&file_name);
|
||||||
let position = params.text_document_position_params.position;
|
let position = params.text_document_position_params.position;
|
||||||
|
|
||||||
self.client
|
|
||||||
.log_message(
|
|
||||||
MessageType::INFO,
|
|
||||||
format!("line {}, col {}", position.line, position.character),
|
|
||||||
)
|
|
||||||
.await;
|
|
||||||
let token = if let Some(tokens) = &tokens {
|
let token = if let Some(tokens) = &tokens {
|
||||||
tokens.iter().find(|tok| {
|
tokens.iter().find(|tok| {
|
||||||
tok.position.1 == position.line + 1
|
tok.position.1 == position.line + 1
|
||||||
@ -95,17 +92,21 @@ impl LanguageServer for Backend {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let ty = if let Some(token) = token {
|
let ty = if let Some(token) = token {
|
||||||
if let Some(ty) = self.types.get(&file_name).unwrap().get(token) {
|
if let Some(possible_ty) = self.types.get(&file_name).unwrap().get(token) {
|
||||||
ty.clone()
|
if let Some(ty) = possible_ty.clone() {
|
||||||
|
format!("{}", ty)
|
||||||
} else {
|
} else {
|
||||||
None
|
String::from("no type")
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
None
|
String::from("no token")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
String::from("no token")
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(Some(Hover {
|
Ok(Some(Hover {
|
||||||
contents: HoverContents::Scalar(MarkedString::String(format!("{:?}", ty))),
|
contents: HoverContents::Scalar(MarkedString::String(format!("{}", ty))),
|
||||||
range: None,
|
range: None,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
@ -139,7 +140,7 @@ impl Backend {
|
|||||||
|
|
||||||
let mut reid_error = None;
|
let mut reid_error = None;
|
||||||
let mut tokens = None;
|
let mut tokens = None;
|
||||||
let token_types = DashMap::new();
|
let mut token_types_opt = None;
|
||||||
|
|
||||||
match parse_module(¶ms.text, file_name.clone(), &mut map) {
|
match parse_module(¶ms.text, file_name.clone(), &mut map) {
|
||||||
Ok(module) => {
|
Ok(module) => {
|
||||||
@ -157,9 +158,11 @@ impl Backend {
|
|||||||
if module.module_id != module_id {
|
if module.module_id != module_id {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
let token_types = DashMap::new();
|
||||||
for (idx, token) in module.tokens.iter().enumerate() {
|
for (idx, token) in module.tokens.iter().enumerate() {
|
||||||
token_types.insert(token.clone(), find_type_in_context(&module, idx));
|
token_types.insert(token.clone(), find_type_in_context(&module, idx));
|
||||||
}
|
}
|
||||||
|
token_types_opt = Some(token_types);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
@ -178,8 +181,9 @@ impl Backend {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let Some(tokens) = &tokens {
|
if let Some(tokens) = &tokens {
|
||||||
if let Some(reid_error) = reid_error {
|
if let Some(mut reid_error) = reid_error {
|
||||||
let mut diagnostics = Vec::new();
|
let mut diagnostics = Vec::new();
|
||||||
|
reid_error.errors.dedup();
|
||||||
for error in reid_error.errors {
|
for error in reid_error.errors {
|
||||||
let meta = error.get_meta();
|
let meta = error.get_meta();
|
||||||
let positions = meta
|
let positions = meta
|
||||||
@ -226,8 +230,10 @@ impl Backend {
|
|||||||
if let Some(tokens) = tokens.take() {
|
if let Some(tokens) = tokens.take() {
|
||||||
self.tokens.insert(file_name.clone(), tokens);
|
self.tokens.insert(file_name.clone(), tokens);
|
||||||
}
|
}
|
||||||
|
if let Some(token_types) = token_types_opt {
|
||||||
self.types.insert(file_name.clone(), token_types);
|
self.types.insert(file_name.clone(), token_types);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
@ -278,7 +284,7 @@ pub fn find_type_in_context(module: &mir::Module, token_idx: usize) -> Option<Ty
|
|||||||
}
|
}
|
||||||
|
|
||||||
return match &function.kind {
|
return match &function.kind {
|
||||||
mir::FunctionDefinitionKind::Local(block, _) => find_type_in_block(&block, token_idx),
|
mir::FunctionDefinitionKind::Local(block, _) => find_type_in_block(&block, module.module_id, token_idx),
|
||||||
mir::FunctionDefinitionKind::Extern(_) => None,
|
mir::FunctionDefinitionKind::Extern(_) => None,
|
||||||
mir::FunctionDefinitionKind::Intrinsic(_) => None,
|
mir::FunctionDefinitionKind::Intrinsic(_) => None,
|
||||||
};
|
};
|
||||||
@ -286,8 +292,151 @@ pub fn find_type_in_context(module: &mir::Module, token_idx: usize) -> Option<Ty
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn find_type_in_block(block: &mir::Block, token_idx: usize) -> Option<TypeKind> {
|
pub fn find_type_in_block(block: &mir::Block, module_id: SourceModuleId, token_idx: usize) -> Option<TypeKind> {
|
||||||
for statement in &block.statements {}
|
if !block.meta.contains(token_idx) {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
for statement in &block.statements {
|
||||||
|
if !statement.1.contains(token_idx) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
match &statement.0 {
|
||||||
|
mir::StmtKind::Let(named_variable_ref, _, expression) => {
|
||||||
|
if named_variable_ref.2.contains(token_idx) {
|
||||||
|
return expression
|
||||||
|
.return_type(&Default::default(), module_id)
|
||||||
|
.ok()
|
||||||
|
.map(|(_, ty)| ty);
|
||||||
|
} else {
|
||||||
|
return find_type_in_expr(&expression, module_id, token_idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mir::StmtKind::Set(lhs, rhs) => {
|
||||||
|
return find_type_in_expr(lhs, module_id, token_idx).or(find_type_in_expr(rhs, module_id, token_idx));
|
||||||
|
}
|
||||||
|
mir::StmtKind::Import(_) => {}
|
||||||
|
mir::StmtKind::Expression(expression) => return find_type_in_expr(expression, module_id, token_idx),
|
||||||
|
mir::StmtKind::While(WhileStatement { condition, block, .. }) => {
|
||||||
|
return find_type_in_expr(condition, module_id, token_idx)
|
||||||
|
.or(find_type_in_block(block, module_id, token_idx));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some((_, Some(return_exp))) = &block.return_expression {
|
||||||
|
if let Some(ty) = find_type_in_expr(return_exp, module_id, token_idx) {
|
||||||
|
return Some(ty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn find_type_in_expr(expr: &mir::Expression, module_id: SourceModuleId, token_idx: usize) -> Option<TypeKind> {
|
||||||
|
if !expr.1.contains(token_idx) {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
match &expr.0 {
|
||||||
|
mir::ExprKind::Variable(named_variable_ref) => Some(named_variable_ref.0.clone()),
|
||||||
|
mir::ExprKind::Indexed(value, type_kind, index_expr) => Some(
|
||||||
|
find_type_in_expr(&value, module_id, token_idx)
|
||||||
|
.or(find_type_in_expr(&index_expr, module_id, token_idx))
|
||||||
|
.unwrap_or(type_kind.clone()),
|
||||||
|
),
|
||||||
|
mir::ExprKind::Accessed(expression, type_kind, _, meta) => {
|
||||||
|
if meta.contains(token_idx) {
|
||||||
|
Some(type_kind.clone())
|
||||||
|
} else {
|
||||||
|
find_type_in_expr(&expression, module_id, token_idx)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mir::ExprKind::Array(expressions) => {
|
||||||
|
for expr in expressions {
|
||||||
|
if let Some(ty) = find_type_in_expr(expr, module_id, token_idx) {
|
||||||
|
return Some(ty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
mir::ExprKind::Struct(name, items) => {
|
||||||
|
for (_, expr, meta) in items {
|
||||||
|
if meta.contains(token_idx) {
|
||||||
|
return expr.return_type(&Default::default(), module_id).map(|(_, t)| t).ok();
|
||||||
|
}
|
||||||
|
if let Some(ty) = find_type_in_expr(expr, module_id, token_idx) {
|
||||||
|
return Some(ty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Some(TypeKind::CustomType(mir::CustomTypeKey(name.clone(), module_id)))
|
||||||
|
}
|
||||||
|
mir::ExprKind::Literal(literal) => Some(literal.as_type()),
|
||||||
|
mir::ExprKind::BinOp(binary_operator, lhs, rhs, type_kind) => {
|
||||||
|
if let Some(ty) = find_type_in_expr(lhs, module_id, token_idx) {
|
||||||
|
return Some(ty);
|
||||||
|
}
|
||||||
|
if let Some(ty) = find_type_in_expr(rhs, module_id, token_idx) {
|
||||||
|
return Some(ty);
|
||||||
|
}
|
||||||
|
Some(type_kind.clone())
|
||||||
|
}
|
||||||
|
mir::ExprKind::FunctionCall(FunctionCall {
|
||||||
|
return_type,
|
||||||
|
parameters,
|
||||||
|
..
|
||||||
|
}) => {
|
||||||
|
for expr in parameters {
|
||||||
|
if let Some(ty) = find_type_in_expr(expr, module_id, token_idx) {
|
||||||
|
return Some(ty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Some(return_type.clone())
|
||||||
|
}
|
||||||
|
mir::ExprKind::AssociatedFunctionCall(
|
||||||
|
_,
|
||||||
|
FunctionCall {
|
||||||
|
return_type,
|
||||||
|
parameters,
|
||||||
|
..
|
||||||
|
},
|
||||||
|
) => {
|
||||||
|
for expr in parameters {
|
||||||
|
if let Some(ty) = find_type_in_expr(expr, module_id, token_idx) {
|
||||||
|
return Some(ty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Some(return_type.clone())
|
||||||
|
}
|
||||||
|
mir::ExprKind::If(IfExpression(cond, then_e, else_e)) => find_type_in_expr(&cond, module_id, token_idx)
|
||||||
|
.or(find_type_in_expr(&then_e, module_id, token_idx))
|
||||||
|
.or(else_e.clone().and_then(|e| find_type_in_expr(&e, module_id, token_idx))),
|
||||||
|
mir::ExprKind::Block(block) => find_type_in_block(block, module_id, token_idx),
|
||||||
|
mir::ExprKind::Borrow(expression, mutable) => {
|
||||||
|
if let Some(ty) = find_type_in_expr(&expression, module_id, token_idx) {
|
||||||
|
return Some(ty);
|
||||||
|
}
|
||||||
|
if let Ok(inner) = expression.return_type(&Default::default(), module_id).map(|(_, ty)| ty) {
|
||||||
|
Some(TypeKind::Borrow(Box::new(inner.clone()), *mutable))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mir::ExprKind::Deref(expression) => {
|
||||||
|
if let Some(ty) = find_type_in_expr(&expression, module_id, token_idx) {
|
||||||
|
return Some(ty);
|
||||||
|
}
|
||||||
|
if let Ok(TypeKind::Borrow(inner, _)) =
|
||||||
|
expression.return_type(&Default::default(), module_id).map(|(_, ty)| ty)
|
||||||
|
{
|
||||||
|
Some(*inner.clone())
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mir::ExprKind::CastTo(expression, type_kind) => {
|
||||||
|
Some(find_type_in_expr(&expression, module_id, token_idx).unwrap_or(type_kind.clone()))
|
||||||
|
}
|
||||||
|
mir::ExprKind::GlobalRef(_, type_kind) => Some(type_kind.clone()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
//! This is the module that contains relevant code to parsing Reid, that is to
|
//! This is the module that contains relevant code to parsing Reid, that is to
|
||||||
//! say transforming a Vec of FullTokens into a loose parsed AST that can be
|
//! say transforming a Vec of FullTokens into a loose parsed AST that can be
|
||||||
//! used for unwrapping syntax sugar, and then be transformed into Reid MIR.
|
//! used for unwrapping syntax sugar, and then be transformed into Reid MIR.
|
||||||
use std::path::PathBuf;
|
use std::{fs::Metadata, path::PathBuf};
|
||||||
|
|
||||||
use token_stream::TokenRange;
|
use token_stream::TokenRange;
|
||||||
|
|
||||||
@ -88,7 +88,7 @@ pub enum ExpressionKind {
|
|||||||
/// Array-indexed, e.g. <expr>[<expr>]
|
/// Array-indexed, e.g. <expr>[<expr>]
|
||||||
Indexed(Box<Expression>, Box<Expression>),
|
Indexed(Box<Expression>, Box<Expression>),
|
||||||
/// Struct-accessed, e.g. <expr>.<expr>
|
/// Struct-accessed, e.g. <expr>.<expr>
|
||||||
Accessed(Box<Expression>, String),
|
Accessed(Box<Expression>, String, TokenRange),
|
||||||
/// Associated function call, but with a shorthand
|
/// Associated function call, but with a shorthand
|
||||||
AccessCall(Box<Expression>, Box<FunctionCallExpression>),
|
AccessCall(Box<Expression>, Box<FunctionCallExpression>),
|
||||||
Binop(BinaryOperator, Box<Expression>, Box<Expression>),
|
Binop(BinaryOperator, Box<Expression>, Box<Expression>),
|
||||||
@ -216,7 +216,7 @@ pub enum ReturnType {
|
|||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct StructExpression {
|
pub struct StructExpression {
|
||||||
name: String,
|
name: String,
|
||||||
fields: Vec<(String, Expression)>,
|
fields: Vec<(String, Expression, TokenRange)>,
|
||||||
range: TokenRange,
|
range: TokenRange,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,10 +191,11 @@ where
|
|||||||
),
|
),
|
||||||
expr.0 .1,
|
expr.0 .1,
|
||||||
),
|
),
|
||||||
ExpressionKind::Accessed(value_expr, index_name) => Expression(
|
ExpressionKind::Accessed(value_expr, index_name, range) => Expression(
|
||||||
ExpressionKind::Accessed(
|
ExpressionKind::Accessed(
|
||||||
Box::new(apply_inner(PrimaryExpression(*value_expr.clone()), fun)),
|
Box::new(apply_inner(PrimaryExpression(*value_expr.clone()), fun)),
|
||||||
index_name.clone(),
|
index_name.clone(),
|
||||||
|
*range,
|
||||||
),
|
),
|
||||||
expr.0 .1,
|
expr.0 .1,
|
||||||
),
|
),
|
||||||
@ -399,9 +400,9 @@ impl Parse for PrimaryExpression {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
ValueIndex::Dot(val) => match val {
|
ValueIndex::Dot(val) => match val {
|
||||||
DotIndexKind::StructValueIndex(name) => {
|
DotIndexKind::StructValueIndex(name, range) => {
|
||||||
expr = Expression(
|
expr = Expression(
|
||||||
ExpressionKind::Accessed(Box::new(expr), name),
|
ExpressionKind::Accessed(Box::new(expr), name, range),
|
||||||
stream.get_range().unwrap(),
|
stream.get_range().unwrap(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -818,9 +819,10 @@ impl Parse for StructExpression {
|
|||||||
let Some(Token::Identifier(name)) = stream.next() else {
|
let Some(Token::Identifier(name)) = stream.next() else {
|
||||||
return Err(stream.expected_err("struct identifier")?);
|
return Err(stream.expected_err("struct identifier")?);
|
||||||
};
|
};
|
||||||
|
|
||||||
stream.expect(Token::BraceOpen)?;
|
stream.expect(Token::BraceOpen)?;
|
||||||
let named_list = stream.parse::<NamedFieldList<Expression>>()?;
|
let named_list = stream.parse::<NamedFieldList<Expression>>()?;
|
||||||
let fields = named_list.0.into_iter().map(|f| (f.0, f.1)).collect();
|
let fields = named_list.0.into_iter().map(|f| (f.0, f.1, f.2)).collect();
|
||||||
|
|
||||||
stream.expect(Token::BraceClose)?;
|
stream.expect(Token::BraceClose)?;
|
||||||
|
|
||||||
@ -897,7 +899,7 @@ impl Parse for ArrayValueIndex {
|
|||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum DotIndexKind {
|
pub enum DotIndexKind {
|
||||||
StructValueIndex(String),
|
StructValueIndex(String, TokenRange),
|
||||||
FunctionCall(FunctionCallExpression),
|
FunctionCall(FunctionCallExpression),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -913,7 +915,7 @@ impl Parse for DotIndexKind {
|
|||||||
is_macro: false,
|
is_macro: false,
|
||||||
}))
|
}))
|
||||||
} else {
|
} else {
|
||||||
Ok(Self::StructValueIndex(name))
|
Ok(Self::StructValueIndex(name, stream.get_range().unwrap()))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return Err(stream.expected_err("struct index (number)")?);
|
return Err(stream.expected_err("struct index (number)")?);
|
||||||
|
@ -375,13 +375,14 @@ impl ast::Expression {
|
|||||||
struct_init
|
struct_init
|
||||||
.fields
|
.fields
|
||||||
.iter()
|
.iter()
|
||||||
.map(|(n, e)| (n.clone(), e.process(module_id)))
|
.map(|(n, e, r)| (n.clone(), e.process(module_id), r.as_meta(module_id)))
|
||||||
.collect(),
|
.collect(),
|
||||||
),
|
),
|
||||||
ast::ExpressionKind::Accessed(expression, name) => mir::ExprKind::Accessed(
|
ast::ExpressionKind::Accessed(expression, name, name_range) => mir::ExprKind::Accessed(
|
||||||
Box::new(expression.process(module_id)),
|
Box::new(expression.process(module_id)),
|
||||||
mir::TypeKind::Vague(mir::VagueType::Unknown),
|
mir::TypeKind::Vague(mir::VagueType::Unknown),
|
||||||
name.clone(),
|
name.clone(),
|
||||||
|
name_range.as_meta(module_id),
|
||||||
),
|
),
|
||||||
ast::ExpressionKind::Borrow(expr, mutable) => {
|
ast::ExpressionKind::Borrow(expr, mutable) => {
|
||||||
mir::ExprKind::Borrow(Box::new(expr.process(module_id)), *mutable)
|
mir::ExprKind::Borrow(Box::new(expr.process(module_id)), *mutable)
|
||||||
|
@ -226,8 +226,8 @@ impl std::ops::Add for TokenRange {
|
|||||||
|
|
||||||
fn add(self, rhs: Self) -> Self::Output {
|
fn add(self, rhs: Self) -> Self::Output {
|
||||||
TokenRange {
|
TokenRange {
|
||||||
start: self.start.min(rhs.start),
|
start: self.start.min(rhs.start).min(rhs.end),
|
||||||
end: self.end.min(rhs.end),
|
end: self.end.max(rhs.end).max(rhs.start),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -133,7 +133,7 @@ impl mir::Expression {
|
|||||||
allocated.extend(expr.allocate(scope));
|
allocated.extend(expr.allocate(scope));
|
||||||
allocated.extend(idx.allocate(scope));
|
allocated.extend(idx.allocate(scope));
|
||||||
}
|
}
|
||||||
mir::ExprKind::Accessed(expression, _, _) => {
|
mir::ExprKind::Accessed(expression, ..) => {
|
||||||
allocated.extend(expression.allocate(scope));
|
allocated.extend(expression.allocate(scope));
|
||||||
}
|
}
|
||||||
mir::ExprKind::Array(expressions) => {
|
mir::ExprKind::Array(expressions) => {
|
||||||
@ -159,7 +159,7 @@ impl mir::Expression {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
allocated.push(Allocation(self.1, ty, allocation));
|
allocated.push(Allocation(self.1, ty, allocation));
|
||||||
|
|
||||||
for (field_name, expression) in items {
|
for (field_name, expression, _) in items {
|
||||||
allocated.extend(expression.allocate(scope));
|
allocated.extend(expression.allocate(scope));
|
||||||
|
|
||||||
let (_, ty) = expression.return_type(&Default::default(), scope.mod_id).unwrap();
|
let (_, ty) = expression.return_type(&Default::default(), scope.mod_id).unwrap();
|
||||||
|
@ -1160,7 +1160,7 @@ impl mir::Expression {
|
|||||||
TypeKind::Array(Box::new(elem_ty_kind), instr_list.len() as u64),
|
TypeKind::Array(Box::new(elem_ty_kind), instr_list.len() as u64),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
mir::ExprKind::Accessed(expression, type_kind, field) => {
|
mir::ExprKind::Accessed(expression, type_kind, field, _) => {
|
||||||
let struct_val = expression.codegen(scope, &state.load(false))?.unwrap();
|
let struct_val = expression.codegen(scope, &state.load(false))?.unwrap();
|
||||||
|
|
||||||
let TypeKind::CodegenPtr(inner) = &struct_val.1 else {
|
let TypeKind::CodegenPtr(inner) = &struct_val.1 else {
|
||||||
@ -1222,7 +1222,7 @@ impl mir::Expression {
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
.maybe_location(&mut scope.block, location.clone());
|
.maybe_location(&mut scope.block, location.clone());
|
||||||
|
|
||||||
for (field_n, exp) in items {
|
for (field_n, exp, _) in items {
|
||||||
let gep_n = format!("{}.{}.gep", name, field_n);
|
let gep_n = format!("{}.{}.gep", name, field_n);
|
||||||
let store_n = format!("{}.{}.store", name, field_n);
|
let store_n = format!("{}.{}.store", name, field_n);
|
||||||
let i = indices.clone().find(|(_, f)| f.0 == *field_n).unwrap().0;
|
let i = indices.clone().find(|(_, f)| f.0 == *field_n).unwrap().0;
|
||||||
|
@ -279,9 +279,9 @@ impl Display for ExprKind {
|
|||||||
let mut state = Default::default();
|
let mut state = Default::default();
|
||||||
let mut inner_f = PadAdapter::wrap(f, &mut state);
|
let mut inner_f = PadAdapter::wrap(f, &mut state);
|
||||||
let mut iter = items.iter();
|
let mut iter = items.iter();
|
||||||
if let Some((name, expr)) = iter.next() {
|
if let Some((name, expr, _)) = iter.next() {
|
||||||
write!(inner_f, "\n{}: {}", name, expr)?;
|
write!(inner_f, "\n{}: {}", name, expr)?;
|
||||||
while let Some((name, expr)) = iter.next() {
|
while let Some((name, expr, _)) = iter.next() {
|
||||||
writeln!(inner_f, ",")?;
|
writeln!(inner_f, ",")?;
|
||||||
write!(inner_f, "{}: {}", name, expr)?;
|
write!(inner_f, "{}: {}", name, expr)?;
|
||||||
}
|
}
|
||||||
@ -289,7 +289,7 @@ impl Display for ExprKind {
|
|||||||
}
|
}
|
||||||
f.write_char('}')
|
f.write_char('}')
|
||||||
}
|
}
|
||||||
ExprKind::Accessed(expression, type_kind, name) => {
|
ExprKind::Accessed(expression, type_kind, name, _) => {
|
||||||
Display::fmt(&expression, f)?;
|
Display::fmt(&expression, f)?;
|
||||||
write_access(f, name)?;
|
write_access(f, name)?;
|
||||||
write!(f, "<{}>", type_kind)
|
write!(f, "<{}>", type_kind)
|
||||||
|
@ -405,7 +405,7 @@ impl Expression {
|
|||||||
TypeKind::Array(Box::new(first.1), expressions.len() as u64),
|
TypeKind::Array(Box::new(first.1), expressions.len() as u64),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
Accessed(_, type_kind, _) => Ok((ReturnKind::Soft, type_kind.clone())),
|
Accessed(_, type_kind, ..) => Ok((ReturnKind::Soft, type_kind.clone())),
|
||||||
Struct(name, _) => Ok((
|
Struct(name, _) => Ok((
|
||||||
ReturnKind::Soft,
|
ReturnKind::Soft,
|
||||||
TypeKind::CustomType(CustomTypeKey(name.clone(), mod_id)),
|
TypeKind::CustomType(CustomTypeKey(name.clone(), mod_id)),
|
||||||
@ -437,7 +437,7 @@ impl Expression {
|
|||||||
match &self.0 {
|
match &self.0 {
|
||||||
ExprKind::Variable(var_ref) => Some(var_ref),
|
ExprKind::Variable(var_ref) => Some(var_ref),
|
||||||
ExprKind::Indexed(lhs, _, _) => lhs.backing_var(),
|
ExprKind::Indexed(lhs, _, _) => lhs.backing_var(),
|
||||||
ExprKind::Accessed(lhs, _, _) => lhs.backing_var(),
|
ExprKind::Accessed(lhs, ..) => lhs.backing_var(),
|
||||||
ExprKind::Borrow(expr, _) => expr.backing_var(),
|
ExprKind::Borrow(expr, _) => expr.backing_var(),
|
||||||
ExprKind::Deref(expr) => expr.backing_var(),
|
ExprKind::Deref(expr) => expr.backing_var(),
|
||||||
ExprKind::Block(block) => block.backing_var(),
|
ExprKind::Block(block) => block.backing_var(),
|
||||||
|
@ -459,7 +459,7 @@ impl<'map> Pass for LinkerPass<'map> {
|
|||||||
super::ExprKind::Indexed(.., type_kind, _) => {
|
super::ExprKind::Indexed(.., type_kind, _) => {
|
||||||
*type_kind = type_kind.update_imported(extern_types, mod_id)
|
*type_kind = type_kind.update_imported(extern_types, mod_id)
|
||||||
}
|
}
|
||||||
super::ExprKind::Accessed(.., type_kind, _) => {
|
super::ExprKind::Accessed(.., type_kind, _, _) => {
|
||||||
*type_kind = type_kind.update_imported(extern_types, mod_id)
|
*type_kind = type_kind.update_imported(extern_types, mod_id)
|
||||||
}
|
}
|
||||||
super::ExprKind::BinOp(.., type_kind) => *type_kind = type_kind.update_imported(extern_types, mod_id),
|
super::ExprKind::BinOp(.., type_kind) => *type_kind = type_kind.update_imported(extern_types, mod_id),
|
||||||
|
@ -262,9 +262,9 @@ pub struct Import(pub Vec<String>, pub Metadata);
|
|||||||
pub enum ExprKind {
|
pub enum ExprKind {
|
||||||
Variable(NamedVariableRef),
|
Variable(NamedVariableRef),
|
||||||
Indexed(Box<Expression>, TypeKind, Box<Expression>),
|
Indexed(Box<Expression>, TypeKind, Box<Expression>),
|
||||||
Accessed(Box<Expression>, TypeKind, String),
|
Accessed(Box<Expression>, TypeKind, String, Metadata),
|
||||||
Array(Vec<Expression>),
|
Array(Vec<Expression>),
|
||||||
Struct(String, Vec<(String, Expression)>),
|
Struct(String, Vec<(String, Expression, Metadata)>),
|
||||||
Literal(Literal),
|
Literal(Literal),
|
||||||
BinOp(BinaryOperator, Box<Expression>, Box<Expression>, TypeKind),
|
BinOp(BinaryOperator, Box<Expression>, Box<Expression>, TypeKind),
|
||||||
FunctionCall(FunctionCall),
|
FunctionCall(FunctionCall),
|
||||||
|
@ -585,7 +585,7 @@ impl Expression {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
ExprKind::Struct(_, items) => {
|
ExprKind::Struct(_, items) => {
|
||||||
for (_, expr) in items {
|
for (_, expr, _) in items {
|
||||||
expr.pass(pass, state, scope, mod_id)?;
|
expr.pass(pass, state, scope, mod_id)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -596,7 +596,7 @@ impl Expression {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ExprKind::Accessed(expression, type_kind, field_name) => {
|
ExprKind::Accessed(expression, type_kind, field_name, _) => {
|
||||||
// Resolve expected type
|
// Resolve expected type
|
||||||
let expected_ty = type_kind.resolve_ref(typerefs);
|
let expected_ty = type_kind.resolve_ref(typerefs);
|
||||||
|
|
||||||
@ -640,7 +640,7 @@ impl Expression {
|
|||||||
HashSet::new()
|
HashSet::new()
|
||||||
};
|
};
|
||||||
|
|
||||||
for (field_name, field_expr) in items {
|
for (field_name, field_expr, _) in items {
|
||||||
// Get expected type, or error if field does not exist
|
// Get expected type, or error if field does not exist
|
||||||
let expected_ty = state.or_else(
|
let expected_ty = state.or_else(
|
||||||
struct_def
|
struct_def
|
||||||
|
@ -526,7 +526,7 @@ impl Expression {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ExprKind::Accessed(expression, type_kind, field_name) => {
|
ExprKind::Accessed(expression, type_kind, field_name, _) => {
|
||||||
let expr_ty = expression.infer_types(state, type_refs)?;
|
let expr_ty = expression.infer_types(state, type_refs)?;
|
||||||
|
|
||||||
// Check that the resolved type is at least a struct, no
|
// Check that the resolved type is at least a struct, no
|
||||||
|
Loading…
Reference in New Issue
Block a user