Import binops while importing types as well
This commit is contained in:
		
							parent
							
								
									58cc633f98
								
							
						
					
					
						commit
						0196fb53ed
					
				| @ -14,6 +14,6 @@ fn otus(param: &mut String) { | ||||
| fn main() -> u8 { | ||||
|     let mut otus = from_str("hello"); | ||||
|     otus(&mut otus); | ||||
|     print(otus); | ||||
|     print(otus + " beep"); | ||||
|     return 0; | ||||
| } | ||||
| @ -5,9 +5,7 @@ | ||||
| use std::{fmt::Debug, marker::PhantomData}; | ||||
| 
 | ||||
| use builder::{BlockValue, Builder, FunctionValue, InstructionValue, ModuleValue, TypeValue}; | ||||
| use debug_information::{ | ||||
|     DebugFileData, DebugInformation, DebugLocationValue, DebugMetadataValue, DebugProgramValue, | ||||
| }; | ||||
| use debug_information::{DebugFileData, DebugInformation, DebugLocationValue, DebugMetadataValue, DebugProgramValue}; | ||||
| use fmt::PrintableModule; | ||||
| 
 | ||||
| pub mod builder; | ||||
| @ -66,13 +64,7 @@ pub struct Module<'ctx> { | ||||
| } | ||||
| 
 | ||||
| impl<'ctx> Module<'ctx> { | ||||
|     pub fn function( | ||||
|         &self, | ||||
|         name: &str, | ||||
|         ret: Type, | ||||
|         params: Vec<Type>, | ||||
|         flags: FunctionFlags, | ||||
|     ) -> Function<'ctx> { | ||||
|     pub fn function(&self, name: &str, ret: Type, params: Vec<Type>, flags: FunctionFlags) -> Function<'ctx> { | ||||
|         unsafe { | ||||
|             Function { | ||||
|                 phantom: PhantomData, | ||||
| @ -111,10 +103,7 @@ impl<'ctx> Module<'ctx> { | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub fn create_debug_info( | ||||
|         &mut self, | ||||
|         file: DebugFileData, | ||||
|     ) -> (DebugInformation, DebugProgramValue) { | ||||
|     pub fn create_debug_info(&mut self, file: DebugFileData) -> (DebugInformation, DebugProgramValue) { | ||||
|         let (debug_info, program_value) = DebugInformation::from_file(file); | ||||
|         self.debug_info = Some(debug_info.clone()); | ||||
|         (debug_info, program_value) | ||||
| @ -144,10 +133,17 @@ pub struct FunctionData { | ||||
| 
 | ||||
| #[derive(Debug, Clone, Copy, Hash)] | ||||
| pub struct FunctionFlags { | ||||
|     /// True in the destination module of the import, false in the source module.
 | ||||
|     pub is_extern: bool, | ||||
|     /// Whether this function is the main function of the module, that should be
 | ||||
|     /// executed (and linked externally also).
 | ||||
|     pub is_main: bool, | ||||
|     /// Whether this function should be available externally always.
 | ||||
|     pub is_pub: bool, | ||||
|     /// If this function is an imported function (either in the source or
 | ||||
|     /// destination module)
 | ||||
|     pub is_imported: bool, | ||||
|     /// Whether this function should add "alwaysinline"-attribute.
 | ||||
|     pub inline: bool, | ||||
| } | ||||
| 
 | ||||
| @ -260,11 +256,7 @@ impl Instr { | ||||
| } | ||||
| 
 | ||||
| impl<'builder> Block<'builder> { | ||||
|     pub fn build_named<T: Into<String>>( | ||||
|         &mut self, | ||||
|         name: T, | ||||
|         instruction: Instr, | ||||
|     ) -> CompileResult<InstructionValue> { | ||||
|     pub fn build_named<T: Into<String>>(&mut self, name: T, instruction: Instr) -> CompileResult<InstructionValue> { | ||||
|         unsafe { | ||||
|             self.builder.add_instruction( | ||||
|                 &self.value, | ||||
| @ -295,15 +287,13 @@ impl<'builder> Block<'builder> { | ||||
| 
 | ||||
|     pub fn set_instr_location(&self, instruction: InstructionValue, location: DebugLocationValue) { | ||||
|         unsafe { | ||||
|             self.builder | ||||
|                 .add_instruction_location(&instruction, location); | ||||
|             self.builder.add_instruction_location(&instruction, location); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub fn set_instr_metadata(&self, instruction: InstructionValue, location: DebugMetadataValue) { | ||||
|         unsafe { | ||||
|             self.builder | ||||
|                 .add_instruction_metadata(&instruction, location); | ||||
|             self.builder.add_instruction_metadata(&instruction, location); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @ -610,16 +600,10 @@ impl Type { | ||||
|             | Type::U32 | ||||
|             | Type::U64 | ||||
|             | Type::U128 => TypeCategory::Integer, | ||||
|             Type::F16 | ||||
|             | Type::F32B | ||||
|             | Type::F32 | ||||
|             | Type::F64 | ||||
|             | Type::F80 | ||||
|             | Type::F128 | ||||
|             | Type::F128PPC => TypeCategory::Real, | ||||
|             Type::Bool | Type::Void | Type::CustomType(_) | Type::Array(_, _) | Type::Ptr(_) => { | ||||
|                 TypeCategory::Other | ||||
|             Type::F16 | Type::F32B | Type::F32 | Type::F64 | Type::F80 | Type::F128 | Type::F128PPC => { | ||||
|                 TypeCategory::Real | ||||
|             } | ||||
|             Type::Bool | Type::Void | Type::CustomType(_) | Type::Array(_, _) | Type::Ptr(_) => TypeCategory::Other, | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @ -630,23 +614,15 @@ impl Type { | ||||
|             (I16, I32 | I64 | I128) => Some(Instr::SExt(value, other.clone())), | ||||
|             (I32, I64 | I128) => Some(Instr::SExt(value, other.clone())), | ||||
|             (I64, I128) => Some(Instr::SExt(value, other.clone())), | ||||
|             (I128 | U128, I64 | U64 | I32 | U32 | I16 | U16 | I8 | U8) => { | ||||
|                 Some(Instr::Trunc(value, other.clone())) | ||||
|             } | ||||
|             (I64 | U64, I32 | U32 | I16 | U16 | I8 | U8) => { | ||||
|                 Some(Instr::Trunc(value, other.clone())) | ||||
|             } | ||||
|             (I128 | U128, I64 | U64 | I32 | U32 | I16 | U16 | I8 | U8) => Some(Instr::Trunc(value, other.clone())), | ||||
|             (I64 | U64, I32 | U32 | I16 | U16 | I8 | U8) => Some(Instr::Trunc(value, other.clone())), | ||||
|             (I32 | U32, I16 | U16 | I8 | U8) => Some(Instr::Trunc(value, other.clone())), | ||||
|             (I16 | U16, I8 | U8) => Some(Instr::Trunc(value, other.clone())), | ||||
|             (U8 | I8, U8 | I8 | U16 | I16 | U32 | I32 | U64 | I64 | U128 | I128) => { | ||||
|                 Some(Instr::ZExt(value, other.clone())) | ||||
|             } | ||||
|             (U16 | I16, U16 | I16 | U32 | I32 | U64 | I64 | U128 | I128) => { | ||||
|                 Some(Instr::ZExt(value, other.clone())) | ||||
|             } | ||||
|             (U32 | I32, U32 | I32 | U64 | I64 | U128 | I128) => { | ||||
|                 Some(Instr::ZExt(value, other.clone())) | ||||
|             } | ||||
|             (U16 | I16, U16 | I16 | U32 | I32 | U64 | I64 | U128 | I128) => Some(Instr::ZExt(value, other.clone())), | ||||
|             (U32 | I32, U32 | I32 | U64 | I64 | U128 | I128) => Some(Instr::ZExt(value, other.clone())), | ||||
|             (U64 | I64, U64 | I64 | U128 | I128) => Some(Instr::ZExt(value, other.clone())), | ||||
|             (U128 | I128, U128 | I128) => Some(Instr::ZExt(value, other.clone())), | ||||
|             (U8 | U16 | U32 | U64 | U128, F16 | F32 | F32B | F64 | F80 | F128 | F128PPC) => { | ||||
| @ -667,15 +643,11 @@ impl Type { | ||||
|             (Ptr(_), I128 | U128 | I64 | U64 | I32 | U32 | I16 | U16 | I8 | U8) => { | ||||
|                 Some(Instr::PtrToInt(value, other.clone())) | ||||
|             } | ||||
|             (F16, F32 | F32B | F64 | F80 | F128 | F128PPC) => { | ||||
|                 Some(Instr::FPExt(value, other.clone())) | ||||
|             } | ||||
|             (F16, F32 | F32B | F64 | F80 | F128 | F128PPC) => Some(Instr::FPExt(value, other.clone())), | ||||
|             (F32 | F32B, F64 | F80 | F128 | F128PPC) => Some(Instr::FPExt(value, other.clone())), | ||||
|             (F64, F80 | F128 | F128PPC) => Some(Instr::FPExt(value, other.clone())), | ||||
|             (F80, F128 | F128PPC) => Some(Instr::FPExt(value, other.clone())), | ||||
|             (F128PPC | F128, F80 | F64 | F32B | F32 | F16) => { | ||||
|                 Some(Instr::FPTrunc(value, other.clone())) | ||||
|             } | ||||
|             (F128PPC | F128, F80 | F64 | F32B | F32 | F16) => Some(Instr::FPTrunc(value, other.clone())), | ||||
|             (F80, F64 | F32B | F32 | F16) => Some(Instr::FPTrunc(value, other.clone())), | ||||
|             (F64, F32B | F32 | F16) => Some(Instr::FPTrunc(value, other.clone())), | ||||
|             (F32B | F32, F16) => Some(Instr::FPTrunc(value, other.clone())), | ||||
|  | ||||
| @ -4,6 +4,21 @@ extern fn malloc(size: u64) -> *u8; | ||||
| extern fn free(ptr: *u8); | ||||
| extern fn div(numerator: i32, denominator: i32) -> div_t; | ||||
| 
 | ||||
| struct String { | ||||
|     inner: *char, | ||||
|     length: u64, | ||||
|     max_length: u64, | ||||
|     must_be_freed: bool, | ||||
| } | ||||
| 
 | ||||
| impl binop (lhs: String) + (rhs: *char) -> String { | ||||
|     let mut new = lhs; | ||||
|     let added = from_str(rhs); | ||||
|     concat_strings(&mut new, added); | ||||
|     free_string(&added); | ||||
|     return lhs; | ||||
| } | ||||
| 
 | ||||
| struct div_t { | ||||
|     quotient: i32, | ||||
|     remainder: i32, | ||||
| @ -21,13 +36,6 @@ pub fn allocate(size: u64) -> *u8 { | ||||
|     malloc(size) | ||||
| } | ||||
| 
 | ||||
| struct String { | ||||
|     inner: *char, | ||||
|     length: u64, | ||||
|     max_length: u64, | ||||
|     must_be_freed: bool, | ||||
| } | ||||
| 
 | ||||
| pub fn new_string() -> String { | ||||
|     String { | ||||
|         inner: allocate(0), | ||||
|  | ||||
| @ -117,6 +117,7 @@ impl ast::Module { | ||||
|                             block.2.as_meta(module_id), | ||||
|                         ), | ||||
|                         meta: signature_range.as_meta(module_id), | ||||
|                         exported: false, | ||||
|                     }); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
| @ -49,6 +49,7 @@ where | ||||
|         return_type: ty.clone(), | ||||
|         fn_kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicSimpleInstr(fun))), | ||||
|         meta: Default::default(), | ||||
|         exported: false, | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -63,6 +64,7 @@ where | ||||
|         return_type: TypeKind::Bool, | ||||
|         fn_kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicBooleanInstr(fun))), | ||||
|         meta: Default::default(), | ||||
|         exported: false, | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -15,7 +15,7 @@ use scope::*; | ||||
| 
 | ||||
| use crate::{ | ||||
|     mir::{ | ||||
|         self, implement::TypeCategory, pass::ScopeBinopKey, CustomTypeKey, FunctionDefinitionKind, NamedVariableRef, | ||||
|         self, implement::TypeCategory, pass::BinopKey, CustomTypeKey, FunctionDefinitionKind, NamedVariableRef, | ||||
|         SourceModuleId, StructField, StructType, TypeDefinition, TypeDefinitionKind, TypeKind, WhileStatement, | ||||
|     }, | ||||
|     util::try_all, | ||||
| @ -214,8 +214,12 @@ impl mir::Module { | ||||
| 
 | ||||
|         let mut binops = HashMap::new(); | ||||
|         for binop in &self.binop_defs { | ||||
|             let binop_fn_name = format!( | ||||
|                 "binop.{}.{:?}.{}.{}", | ||||
|                 binop.lhs.1, binop.op, binop.rhs.1, binop.return_type | ||||
|             ); | ||||
|             binops.insert( | ||||
|                 ScopeBinopKey { | ||||
|                 BinopKey { | ||||
|                     params: (binop.lhs.1.clone(), binop.rhs.1.clone()), | ||||
|                     operator: binop.op, | ||||
|                 }, | ||||
| @ -224,16 +228,14 @@ impl mir::Module { | ||||
|                     return_ty: binop.return_type.clone(), | ||||
|                     kind: match &binop.fn_kind { | ||||
|                         FunctionDefinitionKind::Local(block, metadata) => { | ||||
|                             let binop_fn_name = format!( | ||||
|                                 "binop.{}.{:?}.{}.{}", | ||||
|                                 binop.lhs.1, binop.op, binop.rhs.1, binop.return_type | ||||
|                             ); | ||||
|                             let ir_function = module.function( | ||||
|                                 &binop_fn_name, | ||||
|                                 binop.return_type.get_type(&type_values), | ||||
|                                 vec![binop.lhs.1.get_type(&type_values), binop.rhs.1.get_type(&type_values)], | ||||
|                                 FunctionFlags { | ||||
|                                     inline: true, | ||||
|                                     is_pub: binop.exported, | ||||
|                                     is_imported: binop.exported, | ||||
|                                     ..Default::default() | ||||
|                                 }, | ||||
|                             ); | ||||
| @ -289,7 +291,18 @@ impl mir::Module { | ||||
| 
 | ||||
|                             StackBinopFunctionKind::UserGenerated(ir_function) | ||||
|                         } | ||||
|                         FunctionDefinitionKind::Extern(_) => todo!(), | ||||
|                         FunctionDefinitionKind::Extern(imported) => { | ||||
|                             StackBinopFunctionKind::UserGenerated(module.function( | ||||
|                                 &binop_fn_name, | ||||
|                                 binop.return_type.get_type(&type_values), | ||||
|                                 vec![binop.lhs.1.get_type(&type_values), binop.rhs.1.get_type(&type_values)], | ||||
|                                 FunctionFlags { | ||||
|                                     is_extern: true, | ||||
|                                     is_imported: *imported, | ||||
|                                     ..FunctionFlags::default() | ||||
|                                 }, | ||||
|                             )) | ||||
|                         } | ||||
|                         FunctionDefinitionKind::Intrinsic(intrinsic_function) => { | ||||
|                             StackBinopFunctionKind::Intrinsic(intrinsic_function) | ||||
|                         } | ||||
| @ -704,7 +717,7 @@ impl mir::Expression { | ||||
|                 let lhs = lhs_val.instr(); | ||||
|                 let rhs = rhs_val.instr(); | ||||
| 
 | ||||
|                 let operation = scope.binops.get(&ScopeBinopKey { | ||||
|                 let operation = scope.binops.get(&BinopKey { | ||||
|                     params: (lhs_val.1.clone(), rhs_val.1.clone()), | ||||
|                     operator: *binop, | ||||
|                 }); | ||||
|  | ||||
| @ -8,7 +8,7 @@ use reid_lib::{ | ||||
| 
 | ||||
| use crate::{ | ||||
|     lexer::FullToken, | ||||
|     mir::{pass::ScopeBinopKey, CustomTypeKey, SourceModuleId, TypeDefinition, TypeKind}, | ||||
|     mir::{pass::BinopKey, CustomTypeKey, SourceModuleId, TypeDefinition, TypeKind}, | ||||
| }; | ||||
| 
 | ||||
| use super::{allocator::Allocator, ErrorKind, IntrinsicFunction, ModuleCodegen}; | ||||
| @ -24,7 +24,7 @@ pub struct Scope<'ctx, 'scope> { | ||||
|     pub(super) types: &'scope HashMap<TypeValue, TypeDefinition>, | ||||
|     pub(super) type_values: &'scope HashMap<CustomTypeKey, TypeValue>, | ||||
|     pub(super) functions: &'scope HashMap<String, Function<'ctx>>, | ||||
|     pub(super) binops: &'scope HashMap<ScopeBinopKey, StackBinopDefinition<'ctx>>, | ||||
|     pub(super) binops: &'scope HashMap<BinopKey, StackBinopDefinition<'ctx>>, | ||||
|     pub(super) stack_values: HashMap<String, StackValue>, | ||||
|     pub(super) debug: Option<Debug<'ctx>>, | ||||
|     pub(super) allocator: Rc<RefCell<Allocator>>, | ||||
| @ -150,15 +150,9 @@ impl<'ctx> StackBinopDefinition<'ctx> { | ||||
|             StackBinopFunctionKind::UserGenerated(ir) => { | ||||
|                 let instr = scope | ||||
|                     .block | ||||
|                     .build(Instr::FunctionCall( | ||||
|                         ir.value(), | ||||
|                         vec![lhs.instr(), rhs.instr()], | ||||
|                     )) | ||||
|                     .build(Instr::FunctionCall(ir.value(), vec![lhs.instr(), rhs.instr()])) | ||||
|                     .unwrap(); | ||||
|                 Ok(StackValue( | ||||
|                     StackValueKind::Immutable(instr), | ||||
|                     self.return_ty.clone(), | ||||
|                 )) | ||||
|                 Ok(StackValue(StackValueKind::Immutable(instr), self.return_ty.clone())) | ||||
|             } | ||||
|             StackBinopFunctionKind::Intrinsic(fun) => fun.codegen(scope, &[&lhs, &rhs]), | ||||
|         } | ||||
|  | ||||
| @ -130,7 +130,7 @@ pub fn perform_all_passes<'map>( | ||||
|         for intrinsic in form_intrinsic_binops() { | ||||
|             binops | ||||
|                 .set( | ||||
|                     mir::pass::ScopeBinopKey { | ||||
|                     mir::pass::BinopKey { | ||||
|                         params: (intrinsic.lhs.1.clone(), intrinsic.rhs.1.clone()), | ||||
|                         operator: intrinsic.op, | ||||
|                     }, | ||||
|  | ||||
| @ -66,8 +66,14 @@ impl Display for BinopDefinition { | ||||
|     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { | ||||
|         write!( | ||||
|             f, | ||||
|             "impl binop ({}: {:#}) {} ({}: {:#}) -> {:#} ", | ||||
|             self.lhs.0, self.lhs.1, self.op, self.rhs.0, self.rhs.1, self.return_type | ||||
|             "{}impl binop ({}: {:#}) {} ({}: {:#}) -> {:#} ", | ||||
|             if self.exported { "exported " } else { "" }, | ||||
|             self.lhs.0, | ||||
|             self.lhs.1, | ||||
|             self.op, | ||||
|             self.rhs.0, | ||||
|             self.rhs.1, | ||||
|             self.return_type | ||||
|         )?; | ||||
|         Display::fmt(&self.fn_kind, f) | ||||
|     } | ||||
|  | ||||
| @ -11,7 +11,10 @@ use crate::{ | ||||
|     codegen::scope, | ||||
|     compile_module, | ||||
|     error_raporting::{ErrorModules, ReidError}, | ||||
|     mir::{CustomTypeKey, FunctionDefinitionKind, SourceModuleId, TypeDefinition, TypeKind}, | ||||
|     mir::{ | ||||
|         pass::BinopKey, BinopDefinition, CustomTypeKey, FunctionDefinitionKind, SourceModuleId, TypeDefinition, | ||||
|         TypeKind, | ||||
|     }, | ||||
|     parse_module, | ||||
| }; | ||||
| 
 | ||||
| @ -110,6 +113,7 @@ impl<'map> Pass for LinkerPass<'map> { | ||||
|         let mut modules_to_process: Vec<Rc<RefCell<_>>> = modules.values().cloned().collect(); | ||||
| 
 | ||||
|         let mut already_imported_types = HashSet::<CustomTypeKey>::new(); | ||||
|         let mut already_imported_binops = HashSet::<BinopKey>::new(); | ||||
| 
 | ||||
|         while let Some(module) = modules_to_process.pop() { | ||||
|             let mut extern_types = HashMap::new(); | ||||
| @ -232,10 +236,39 @@ impl<'map> Pass for LinkerPass<'map> { | ||||
|                         kind: super::FunctionDefinitionKind::Extern(true), | ||||
|                     }); | ||||
|                 } else if let Some(ty) = imported.typedefs.iter_mut().find(|f| f.name == *import_name) { | ||||
|                     dbg!("hello??"); | ||||
|                     let external_key = CustomTypeKey(ty.name.clone(), ty.source_module); | ||||
|                     let imported_ty = TypeKind::CustomType(external_key.clone()); | ||||
|                     imported_types.push((external_key, true)); | ||||
|                     dbg!(&imported_types); | ||||
| 
 | ||||
|                     for binop in &mut imported.binop_defs { | ||||
|                         if binop.lhs.1 != imported_ty && binop.rhs.1 != imported_ty { | ||||
|                             continue; | ||||
|                         } | ||||
|                         let binop_key = BinopKey { | ||||
|                             params: (binop.lhs.1.clone(), binop.rhs.1.clone()), | ||||
|                             operator: binop.op, | ||||
|                         }; | ||||
|                         if already_imported_binops.contains(&binop_key) { | ||||
|                             continue; | ||||
|                         } | ||||
|                         binop.exported = true; | ||||
|                         already_imported_binops.insert(binop_key); | ||||
|                         match &binop.fn_kind { | ||||
|                             FunctionDefinitionKind::Local(block, metadata) => { | ||||
|                                 importer_module.binop_defs.push(BinopDefinition { | ||||
|                                     lhs: binop.lhs.clone(), | ||||
|                                     op: binop.op, | ||||
|                                     rhs: binop.rhs.clone(), | ||||
|                                     return_type: binop.return_type.clone(), | ||||
|                                     fn_kind: FunctionDefinitionKind::Extern(true), | ||||
|                                     meta: binop.meta.clone(), | ||||
|                                     exported: false, | ||||
|                                 }); | ||||
|                             } | ||||
|                             FunctionDefinitionKind::Extern(_) => {} | ||||
|                             FunctionDefinitionKind::Intrinsic(_) => {} | ||||
|                         } | ||||
|                     } | ||||
|                 } else { | ||||
|                     state.ok::<_, Infallible>( | ||||
|                         Err(ErrorKind::ImportDoesNotExist(module_name.clone(), import_name.clone())), | ||||
|  | ||||
| @ -370,6 +370,8 @@ pub struct BinopDefinition { | ||||
|     pub return_type: TypeKind, | ||||
|     pub fn_kind: FunctionDefinitionKind, | ||||
|     pub meta: Metadata, | ||||
|     // Wether this binop definition has been imported into another module.
 | ||||
|     pub exported: bool, | ||||
| } | ||||
| 
 | ||||
| impl BinopDefinition { | ||||
|  | ||||
| @ -117,7 +117,7 @@ impl<Key: std::hash::Hash + Eq, T: Clone + std::fmt::Debug> Storage<Key, T> { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub type BinopMap = Storage<ScopeBinopKey, ScopeBinopDef>; | ||||
| pub type BinopMap = Storage<BinopKey, ScopeBinopDef>; | ||||
| 
 | ||||
| #[derive(Clone, Default, Debug)] | ||||
| pub struct Scope<Data: Clone + Default> { | ||||
| @ -182,7 +182,7 @@ pub struct ScopeVariable { | ||||
| } | ||||
| 
 | ||||
| #[derive(Clone, Debug, Eq)] | ||||
| pub struct ScopeBinopKey { | ||||
| pub struct BinopKey { | ||||
|     pub params: (TypeKind, TypeKind), | ||||
|     pub operator: BinaryOperator, | ||||
| } | ||||
| @ -194,7 +194,7 @@ pub enum CommutativeKind { | ||||
|     Any, | ||||
| } | ||||
| 
 | ||||
| impl PartialEq for ScopeBinopKey { | ||||
| impl PartialEq for BinopKey { | ||||
|     fn eq(&self, other: &Self) -> bool { | ||||
|         if self.operator != other.operator { | ||||
|             return false; | ||||
| @ -216,7 +216,7 @@ impl PartialEq for ScopeBinopKey { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl std::hash::Hash for ScopeBinopKey { | ||||
| impl std::hash::Hash for BinopKey { | ||||
|     fn hash<H: std::hash::Hasher>(&self, state: &mut H) { | ||||
|         if self.operator.is_commutative() { | ||||
|             let mut sorted = vec![&self.params.0, &self.params.1]; | ||||
| @ -336,7 +336,7 @@ impl Context { | ||||
|             scope | ||||
|                 .binops | ||||
|                 .set( | ||||
|                     ScopeBinopKey { | ||||
|                     BinopKey { | ||||
|                         params: (intrinsic.lhs.1.clone(), intrinsic.rhs.1.clone()), | ||||
|                         operator: intrinsic.op, | ||||
|                     }, | ||||
| @ -374,7 +374,7 @@ impl Module { | ||||
|             scope | ||||
|                 .binops | ||||
|                 .set( | ||||
|                     ScopeBinopKey { | ||||
|                     BinopKey { | ||||
|                         params: (binop.lhs.1.clone(), binop.rhs.1.clone()), | ||||
|                         operator: binop.op, | ||||
|                     }, | ||||
|  | ||||
| @ -422,7 +422,7 @@ impl Expression { | ||||
|                     ); | ||||
|                 }; | ||||
| 
 | ||||
|                 let binops = state.scope.binops.filter(&pass::ScopeBinopKey { | ||||
|                 let binops = state.scope.binops.filter(&pass::BinopKey { | ||||
|                     params: (lhs_type.clone(), rhs_type.clone()), | ||||
|                     operator: *op, | ||||
|                 }); | ||||
|  | ||||
| @ -20,7 +20,7 @@ use crate::{ | ||||
| 
 | ||||
| use super::{ | ||||
|     super::{ | ||||
|         pass::{Pass, PassResult, PassState, ScopeBinopKey}, | ||||
|         pass::{BinopKey, Pass, PassResult, PassState}, | ||||
|         TypeKind::*, | ||||
|         VagueType::*, | ||||
|     }, | ||||
| @ -62,7 +62,7 @@ impl<'t> Pass for TypeInference<'t> { | ||||
| 
 | ||||
|         let mut seen_binops = HashSet::new(); | ||||
|         for binop in &module.binop_defs { | ||||
|             let binop_key = ScopeBinopKey { | ||||
|             let binop_key = BinopKey { | ||||
|                 params: (binop.lhs.1.clone(), binop.rhs.1.clone()), | ||||
|                 operator: binop.op, | ||||
|             }; | ||||
|  | ||||
| @ -10,7 +10,7 @@ use crate::{ | ||||
| }; | ||||
| 
 | ||||
| use super::{ | ||||
|     super::pass::{ScopeBinopDef, ScopeBinopKey, Storage}, | ||||
|     super::pass::{BinopKey, ScopeBinopDef, Storage}, | ||||
|     ErrorKind, | ||||
| }; | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user