Add type inference for borrow/deref
This commit is contained in:
		
							parent
							
								
									26818cec96
								
							
						
					
					
						commit
						cf30f79951
					
				| @ -56,6 +56,8 @@ pub enum ErrorKind { | |||||||
|     RecursiveTypeDefinition(String, String), |     RecursiveTypeDefinition(String, String), | ||||||
|     #[error("This type of expression can not be used for assignment")] |     #[error("This type of expression can not be used for assignment")] | ||||||
|     InvalidSetExpression, |     InvalidSetExpression, | ||||||
|  |     #[error("Can not deref {0}, as it is not a borrow")] | ||||||
|  |     AttemptedDerefNonBorrow(String), | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Struct used to implement a type-checking pass that can be performed on the
 | /// Struct used to implement a type-checking pass that can be performed on the
 | ||||||
|  | |||||||
| @ -111,7 +111,7 @@ impl Block { | |||||||
|                 StmtKind::Set(lhs, rhs) => { |                 StmtKind::Set(lhs, rhs) => { | ||||||
|                     // Infer hints for the expression itself
 |                     // Infer hints for the expression itself
 | ||||||
|                     let lhs_infer = lhs.infer_types(&mut state, &inner_refs); |                     let lhs_infer = lhs.infer_types(&mut state, &inner_refs); | ||||||
|                     let lhs_ref = state.ok(lhs_infer, rhs.1); |                     let lhs_ref = state.ok(lhs_infer, lhs.1); | ||||||
| 
 | 
 | ||||||
|                     // Infer hints for the expression itself
 |                     // Infer hints for the expression itself
 | ||||||
|                     let rhs_infer = rhs.infer_types(&mut state, &inner_refs); |                     let rhs_infer = rhs.infer_types(&mut state, &inner_refs); | ||||||
| @ -364,8 +364,39 @@ impl Expression { | |||||||
|                     .from_type(&TypeKind::CustomType(struct_name.clone())) |                     .from_type(&TypeKind::CustomType(struct_name.clone())) | ||||||
|                     .unwrap()) |                     .unwrap()) | ||||||
|             } |             } | ||||||
|             ExprKind::Borrow(named_variable_ref) => todo!(), |             ExprKind::Borrow(var) => { | ||||||
|             ExprKind::Deref(named_variable_ref) => todo!(), |                 // Find variable type
 | ||||||
|  |                 let type_ref = type_refs | ||||||
|  |                     .find_var(&var.1) | ||||||
|  |                     .map(|(_, hint)| hint) | ||||||
|  |                     .ok_or(ErrorKind::VariableNotDefined(var.1.clone())); | ||||||
|  | 
 | ||||||
|  |                 // Update MIR type to TypeRef if found
 | ||||||
|  |                 if let Ok(hint) = &type_ref { | ||||||
|  |                     var.0 = hint.as_type(); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 Ok(type_refs | ||||||
|  |                     .from_type(&TypeKind::Borrow(Box::new(var.0.clone()))) | ||||||
|  |                     .unwrap()) | ||||||
|  |             } | ||||||
|  |             ExprKind::Deref(var) => { | ||||||
|  |                 // Find variable type
 | ||||||
|  |                 let type_ref = type_refs | ||||||
|  |                     .find_var(&var.1) | ||||||
|  |                     .map(|(_, hint)| hint) | ||||||
|  |                     .ok_or(ErrorKind::VariableNotDefined(var.1.clone())); | ||||||
|  | 
 | ||||||
|  |                 // Update MIR type to TypeRef if found
 | ||||||
|  |                 if let Ok(hint) = &type_ref { | ||||||
|  |                     var.0 = hint.as_type(); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 match &var.0.resolve_weak(type_refs.types) { | ||||||
|  |                     Borrow(type_kind) => Ok(type_refs.from_type(&type_kind).unwrap()), | ||||||
|  |                     _ => Err(ErrorKind::AttemptedDerefNonBorrow(var.1.clone())), | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user