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 { | ||||||
|  |                     String::from("no type") | ||||||
|  |                 } | ||||||
|             } else { |             } else { | ||||||
|                 None |                 String::from("no token") | ||||||
|             } |             } | ||||||
|         } else { |         } else { | ||||||
|             None |             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,7 +230,9 @@ 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); | ||||||
|         } |         } | ||||||
|         self.types.insert(file_name.clone(), token_types); |         if let Some(token_types) = token_types_opt { | ||||||
|  |             self.types.insert(file_name.clone(), token_types); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -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