TODO: - Get all run-pass and run-fail tests passing resolve - Lots of fixes to do here - Audit TODOs in codebase - MIR Optimisations - Dead code eliminiation - Remove variables that are just assigned from arguments - Convert enum variants to point to structs for the data type - Four types of variants: Unit, Value, Tuple1, Composite - TODO: Have value enums be a different structure to data enums - Tuple1 is a special case to reduce the cost of Some/Ok/Err/... - This may have to wait for a rustc RFC? (or can hide the structs for now) - Clean up Span code to correctly handle nested spans - Clean up AST - Almost done, just a few little niggles left - Split arg patterns and arg types up for cleaner serialisation - Could be a good idea to do as part of changing HIR::TraitImpl to only contain the impl data - May not be too useful due to argument monomorphisation. - Optimise typecheck. - MIR: Unify Variable/Argument/Temporary LValue types - This should reduce the amount of code needed for validation, but will be a BIG change. ## Optimisations - Argument propagation: replace assignments from Argument(_) if target is only written once - Dead assignment removal (Delete ` = Use()` - Tuple destructure removal - Spot `#1 = (...,)`, `#2 = (#1).n` where #1 is Write-once, borrow-none