Refactor a bit
This commit is contained in:
		
							parent
							
								
									2293b6edb8
								
							
						
					
					
						commit
						74ce296a05
					
				| @ -1,4 +1,6 @@ | |||||||
| use super::{typecheck::ErrorKind, typerefs::TypeRefs, VagueType as Vague, *}; | use crate::util::try_all; | ||||||
|  | 
 | ||||||
|  | use super::{pass::ScopeFunction, typecheck::ErrorKind, typerefs::TypeRefs, VagueType as Vague, *}; | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Clone)] | #[derive(Debug, Clone)] | ||||||
| pub enum ReturnTypeOther { | pub enum ReturnTypeOther { | ||||||
| @ -350,6 +352,64 @@ impl TypeKind { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | pub trait Collapsable: Sized + Clone { | ||||||
|  |     /// Try to narrow two types into one singular type. E.g. Vague(Number) and
 | ||||||
|  |     /// I32 could be narrowed to just I32.
 | ||||||
|  |     fn collapse_into(&self, other: &Self) -> Result<Self, ErrorKind>; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl Collapsable for TypeKind { | ||||||
|  |     fn collapse_into(&self, other: &TypeKind) -> Result<TypeKind, ErrorKind> { | ||||||
|  |         if self == other { | ||||||
|  |             return Ok(self.clone()); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         match (self, other) { | ||||||
|  |             (TypeKind::Vague(Vague::Number), other) | (other, TypeKind::Vague(Vague::Number)) => { | ||||||
|  |                 match other { | ||||||
|  |                     TypeKind::Vague(Vague::Unknown) => Ok(TypeKind::Vague(Vague::Number)), | ||||||
|  |                     TypeKind::Vague(Vague::Number) => Ok(TypeKind::Vague(Vague::Number)), | ||||||
|  |                     TypeKind::I8 | ||||||
|  |                     | TypeKind::I16 | ||||||
|  |                     | TypeKind::I32 | ||||||
|  |                     | TypeKind::I64 | ||||||
|  |                     | TypeKind::I128 | ||||||
|  |                     | TypeKind::U8 | ||||||
|  |                     | TypeKind::U16 | ||||||
|  |                     | TypeKind::U32 | ||||||
|  |                     | TypeKind::U64 | ||||||
|  |                     | TypeKind::U128 => Ok(other.clone()), | ||||||
|  |                     _ => Err(ErrorKind::TypesIncompatible(self.clone(), other.clone())), | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             (TypeKind::Vague(Vague::Unknown), other) | (other, TypeKind::Vague(Vague::Unknown)) => { | ||||||
|  |                 Ok(other.clone()) | ||||||
|  |             } | ||||||
|  |             (TypeKind::Borrow(val1, mut1), TypeKind::Borrow(val2, mut2)) => Ok(TypeKind::Borrow( | ||||||
|  |                 Box::new(val1.collapse_into(val2)?), | ||||||
|  |                 *mut1 && *mut2, | ||||||
|  |             )), | ||||||
|  |             _ => Err(ErrorKind::TypesIncompatible(self.clone(), other.clone())), | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl Collapsable for ScopeFunction { | ||||||
|  |     fn collapse_into(&self, other: &ScopeFunction) -> Result<ScopeFunction, ErrorKind> { | ||||||
|  |         Ok(ScopeFunction { | ||||||
|  |             ret: self.ret.collapse_into(&other.ret)?, | ||||||
|  |             params: try_all( | ||||||
|  |                 self.params | ||||||
|  |                     .iter() | ||||||
|  |                     .zip(&other.params) | ||||||
|  |                     .map(|(p1, p2)| p1.collapse_into(&p2)) | ||||||
|  |                     .collect(), | ||||||
|  |             ) | ||||||
|  |             .map_err(|e| e.first().unwrap().clone())?, | ||||||
|  |         }) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #[derive(Debug, Clone, thiserror::Error, PartialEq, Eq, PartialOrd, Ord)] | #[derive(Debug, Clone, thiserror::Error, PartialEq, Eq, PartialOrd, Ord)] | ||||||
| pub enum EqualsIssue { | pub enum EqualsIssue { | ||||||
|     #[error("Function is already defined locally at {:?}", (.0).range)] |     #[error("Function is already defined locally at {:?}", (.0).range)] | ||||||
| @ -16,8 +16,8 @@ use crate::{ | |||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| use super::{ | use super::{ | ||||||
|  |     implement::EqualsIssue, | ||||||
|     pass::{Pass, PassResult, PassState}, |     pass::{Pass, PassResult, PassState}, | ||||||
|     r#impl::EqualsIssue, |  | ||||||
|     Context, FunctionDefinition, Import, Metadata, Module, |     Context, FunctionDefinition, Import, Metadata, Module, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -10,7 +10,7 @@ use crate::{ | |||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| mod fmt; | mod fmt; | ||||||
| pub mod r#impl; | pub mod implement; | ||||||
| pub mod linker; | pub mod linker; | ||||||
| pub mod pass; | pub mod pass; | ||||||
| pub mod typecheck; | pub mod typecheck; | ||||||
|  | |||||||
| @ -6,7 +6,8 @@ use crate::{mir::*, util::try_all}; | |||||||
| use VagueType as Vague; | use VagueType as Vague; | ||||||
| 
 | 
 | ||||||
| use super::{ | use super::{ | ||||||
|     pass::{Pass, PassResult, PassState, ScopeFunction, ScopeVariable}, |     implement::Collapsable, | ||||||
|  |     pass::{Pass, PassResult, PassState, ScopeVariable}, | ||||||
|     typerefs::TypeRefs, |     typerefs::TypeRefs, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| @ -725,63 +726,3 @@ impl Literal { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 |  | ||||||
| impl TypeKind {} |  | ||||||
| 
 |  | ||||||
| pub trait Collapsable: Sized + Clone { |  | ||||||
|     /// Try to narrow two types into one singular type. E.g. Vague(Number) and
 |  | ||||||
|     /// I32 could be narrowed to just I32.
 |  | ||||||
|     fn collapse_into(&self, other: &Self) -> Result<Self, ErrorKind>; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl Collapsable for TypeKind { |  | ||||||
|     fn collapse_into(&self, other: &TypeKind) -> Result<TypeKind, ErrorKind> { |  | ||||||
|         if self == other { |  | ||||||
|             return Ok(self.clone()); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         match (self, other) { |  | ||||||
|             (TypeKind::Vague(Vague::Number), other) | (other, TypeKind::Vague(Vague::Number)) => { |  | ||||||
|                 match other { |  | ||||||
|                     TypeKind::Vague(Vague::Unknown) => Ok(TypeKind::Vague(Vague::Number)), |  | ||||||
|                     TypeKind::Vague(Vague::Number) => Ok(TypeKind::Vague(Vague::Number)), |  | ||||||
|                     TypeKind::I8 |  | ||||||
|                     | TypeKind::I16 |  | ||||||
|                     | TypeKind::I32 |  | ||||||
|                     | TypeKind::I64 |  | ||||||
|                     | TypeKind::I128 |  | ||||||
|                     | TypeKind::U8 |  | ||||||
|                     | TypeKind::U16 |  | ||||||
|                     | TypeKind::U32 |  | ||||||
|                     | TypeKind::U64 |  | ||||||
|                     | TypeKind::U128 => Ok(other.clone()), |  | ||||||
|                     _ => Err(ErrorKind::TypesIncompatible(self.clone(), other.clone())), |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             (TypeKind::Vague(Vague::Unknown), other) | (other, TypeKind::Vague(Vague::Unknown)) => { |  | ||||||
|                 Ok(other.clone()) |  | ||||||
|             } |  | ||||||
|             (TypeKind::Borrow(val1, mut1), TypeKind::Borrow(val2, mut2)) => Ok(TypeKind::Borrow( |  | ||||||
|                 Box::new(val1.collapse_into(val2)?), |  | ||||||
|                 *mut1 && *mut2, |  | ||||||
|             )), |  | ||||||
|             _ => Err(ErrorKind::TypesIncompatible(self.clone(), other.clone())), |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl Collapsable for ScopeFunction { |  | ||||||
|     fn collapse_into(&self, other: &ScopeFunction) -> Result<ScopeFunction, ErrorKind> { |  | ||||||
|         Ok(ScopeFunction { |  | ||||||
|             ret: self.ret.collapse_into(&other.ret)?, |  | ||||||
|             params: try_all( |  | ||||||
|                 self.params |  | ||||||
|                     .iter() |  | ||||||
|                     .zip(&other.params) |  | ||||||
|                     .map(|(p1, p2)| p1.collapse_into(&p2)) |  | ||||||
|                     .collect(), |  | ||||||
|             ) |  | ||||||
|             .map_err(|e| e.first().unwrap().clone())?, |  | ||||||
|         }) |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | |||||||
| @ -9,8 +9,8 @@ use std::{convert::Infallible, iter}; | |||||||
| use crate::{mir::TypeKind, util::try_all}; | use crate::{mir::TypeKind, util::try_all}; | ||||||
| 
 | 
 | ||||||
| use super::{ | use super::{ | ||||||
|  |     implement::pick_return, | ||||||
|     pass::{Pass, PassResult, PassState}, |     pass::{Pass, PassResult, PassState}, | ||||||
|     r#impl::pick_return, |  | ||||||
|     typecheck::ErrorKind, |     typecheck::ErrorKind, | ||||||
|     typerefs::{ScopeTypeRefs, TypeRef, TypeRefs}, |     typerefs::{ScopeTypeRefs, TypeRef, TypeRefs}, | ||||||
|     Block, ExprKind, Expression, FunctionDefinition, FunctionDefinitionKind, IfExpression, Module, |     Block, ExprKind, Expression, FunctionDefinition, FunctionDefinitionKind, IfExpression, Module, | ||||||
|  | |||||||
| @ -6,10 +6,7 @@ use std::{ | |||||||
| 
 | 
 | ||||||
| use crate::mir::VagueType; | use crate::mir::VagueType; | ||||||
| 
 | 
 | ||||||
| use super::{ | use super::{implement::Collapsable, typecheck::ErrorKind, BinaryOperator, TypeKind}; | ||||||
|     typecheck::{Collapsable, ErrorKind}, |  | ||||||
|     BinaryOperator, TypeKind, |  | ||||||
| }; |  | ||||||
| 
 | 
 | ||||||
| #[derive(Clone)] | #[derive(Clone)] | ||||||
| pub struct TypeRef<'scope>(TypeIdRef, &'scope ScopeTypeRefs<'scope>); | pub struct TypeRef<'scope>(TypeIdRef, &'scope ScopeTypeRefs<'scope>); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user