diff options
-rw-r--r-- | src/hir/from_ast.cpp | 99 | ||||
-rw-r--r-- | src/hir/type.cpp | 5 | ||||
-rw-r--r-- | src/hir/type.hpp | 42 | ||||
-rw-r--r-- | src/include/tagged_union.hpp | 4 |
4 files changed, 138 insertions, 12 deletions
diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp index 9f07b08e..515a815b 100644 --- a/src/hir/from_ast.cpp +++ b/src/hir/from_ast.cpp @@ -35,13 +35,108 @@ throw ::std::runtime_error("TODO: LowerHIR_GenericParams"); } +::HIR::ExprPtr LowerHIR_Expr(const ::std::shared_ptr< ::AST::ExprNode>& e) +{ + throw ::std::runtime_error("TODO: LowerHIR_Expr"); +} ::HIR::ExprPtr LowerHIR_Expr(const ::AST::Expr& e) { throw ::std::runtime_error("TODO: LowerHIR_Expr"); } -::HIR::TypeRef LowerHIR_Type(const ::TypeRef& e) + +::HIR::GenericPath LowerHIR_GenericPath(const ::AST::Path& path) +{ + throw ::std::runtime_error("TODO: LowerHIR_GenericPath"); +} +::HIR::Path LowerHIR_Path(const ::AST::Path& path) { - throw ::std::runtime_error("TODO: LowerHIR_Type"); + throw ::std::runtime_error("TODO: LowerHIR_Path"); +} + +::HIR::TypeRef LowerHIR_Type(const ::TypeRef& ty) +{ + TU_MATCH(::TypeData, (ty.m_data), (e), + (None, + TODO(ty.span(), "TypeData::None"); + ), + (Any, + return ::HIR::TypeRef(); + ), + (Unit, + return ::HIR::TypeRef( ::HIR::TypeRef::Data::make_Tuple({}) ); + ), + (Macro, + BUG(ty.span(), "TypeData::None"); + ), + (Primitive, + switch(e.core_type) + { + case CORETYPE_BOOL: return ::HIR::TypeRef( ::HIR::CoreType::Bool ); + case CORETYPE_CHAR: return ::HIR::TypeRef( ::HIR::CoreType::Char ); + case CORETYPE_F32: return ::HIR::TypeRef( ::HIR::CoreType::F32 ); + case CORETYPE_F64: return ::HIR::TypeRef( ::HIR::CoreType::F64 ); + + case CORETYPE_I8 : return ::HIR::TypeRef( ::HIR::CoreType::I8 ); + case CORETYPE_U8 : return ::HIR::TypeRef( ::HIR::CoreType::U8 ); + case CORETYPE_I16: return ::HIR::TypeRef( ::HIR::CoreType::I16 ); + case CORETYPE_U16: return ::HIR::TypeRef( ::HIR::CoreType::U16 ); + case CORETYPE_I32: return ::HIR::TypeRef( ::HIR::CoreType::I32 ); + case CORETYPE_U32: return ::HIR::TypeRef( ::HIR::CoreType::U32 ); + case CORETYPE_I64: return ::HIR::TypeRef( ::HIR::CoreType::I64 ); + case CORETYPE_U64: return ::HIR::TypeRef( ::HIR::CoreType::U64 ); + + case CORETYPE_INT: return ::HIR::TypeRef( ::HIR::CoreType::Isize ); + case CORETYPE_UINT: return ::HIR::TypeRef( ::HIR::CoreType::Usize ); + case CORETYPE_ANY: + TODO(ty.span(), "TypeData::Primitive - CORETYPE_ANY"); + case CORETYPE_INVAL: + BUG(ty.span(), "TypeData::Primitive - CORETYPE_INVAL"); + } + ), + (Tuple, + ::HIR::TypeRef::Data::Data_Tuple v; + for( const auto& st : e.inner_types ) + { + v.push_back( LowerHIR_Type(st) ); + } + return ::HIR::TypeRef( ::HIR::TypeRef::Data::make_Tuple(mv$(v)) ); + ), + (Borrow, + auto cl = (e.is_mut ? ::HIR::BorrowType::Unique : ::HIR::BorrowType::Shared); + return ::HIR::TypeRef( ::HIR::TypeRef::Data( ::HIR::TypeRef::Data::Data_Borrow { cl, box$(LowerHIR_Type(*e.inner)) } ) ); + ), + (Pointer, + return ::HIR::TypeRef( ::HIR::TypeRef::Data::make_Pointer({e.is_mut, box$(LowerHIR_Type(*e.inner))}) ); + ), + (Array, + return ::HIR::TypeRef( ::HIR::TypeRef::Data::make_Array({ + box$( LowerHIR_Type(*e.inner) ), + LowerHIR_Expr( e.size ) + }) ); + ), + + (Path, + return ::HIR::TypeRef( LowerHIR_Path(e.path) ); + ), + (TraitObject, + if( e.hrls.size() > 0 ) + TODO(ty.span(), "TODO: TraitObjects with HRLS"); + ::HIR::TypeRef::Data::Data_TraitObject v; + for(const auto& t : e.traits) + { + v.m_traits.push_back( LowerHIR_GenericPath(t) ); + } + return ::HIR::TypeRef( ::HIR::TypeRef::Data::make_TraitObject( mv$(v) ) ); + ), + (Function, + ::HIR::FunctionType f; + return ::HIR::TypeRef( ::HIR::TypeRef::Data::make_Function( mv$(f) ) ); + ), + (Generic, + return ::HIR::TypeRef( ::HIR::TypeRef::Data::make_Generic({ e.name, 0 }) ); + ) + ) + throw "BUGCHECK: Reached end of LowerHIR_Type"; } ::HIR::TypeAlias LowerHIR_TypeAlias(const ::AST::TypeAlias& ta) diff --git a/src/hir/type.cpp b/src/hir/type.cpp index 45e50e6e..286136f9 100644 --- a/src/hir/type.cpp +++ b/src/hir/type.cpp @@ -4,9 +4,4 @@ namespace HIR { -TypeRef::TypeRef(::HIR::Path path): - type( TypeRef::Data::make_Path(mv$(path)) ) -{ -} - } diff --git a/src/hir/type.hpp b/src/hir/type.hpp index 7e09a687..953224f3 100644 --- a/src/hir/type.hpp +++ b/src/hir/type.hpp @@ -9,6 +9,8 @@ namespace HIR { +struct TypeRef; + enum class CoreType { Usize, Isize, @@ -19,6 +21,7 @@ enum class CoreType F32, F64, + Bool, Char, Str, }; enum class BorrowType @@ -28,6 +31,19 @@ enum class BorrowType Owned, }; +struct LifetimeRef +{ + ::std::string name; +}; + +struct FunctionType +{ + bool is_unsafe; + ::std::string m_abi; + ::std::unique_ptr<TypeRef> m_rettype; + ::std::vector<TypeRef> m_arg_types; +}; + struct TypeRef { // Options: @@ -44,6 +60,14 @@ struct TypeRef (Infer, struct {}), (Primitive, ::HIR::CoreType), (Path, ::HIR::Path), + (Generic, struct { + ::std::string name; + unsigned int binding; + }), + (TraitObject, struct { + ::std::vector< ::HIR::GenericPath > m_traits; + ::HIR::LifetimeRef m_lifetime; + }), (Array, struct { ::std::unique_ptr<TypeRef> inner; ::HIR::ExprPtr size; @@ -56,13 +80,25 @@ struct TypeRef (Pointer, struct { bool is_mut; ::std::unique_ptr<TypeRef> inner; - }) + }), + (Function, FunctionType) ); - Data type; + Data m_data; + TypeRef() {} + TypeRef(TypeRef&& ) = default; + TypeRef(const TypeRef& ) = delete; - TypeRef(::HIR::Path _); + TypeRef(::HIR::TypeRef::Data x): + m_data( mv$(x) ) + {} + TypeRef(::HIR::CoreType ct): + m_data( Data::make_Primitive(mv$(ct)) ) + {} + TypeRef(::HIR::Path p): + m_data( Data::make_Path(mv$(p)) ) + {} }; } // namespace HIR diff --git a/src/include/tagged_union.hpp b/src/include/tagged_union.hpp index de524558..f247f226 100644 --- a/src/include/tagged_union.hpp +++ b/src/include/tagged_union.hpp @@ -185,9 +185,9 @@ #define TAGGED_UNION_EX(_name, _inherit, _def, _variants, _extra_move, _extra_assign, _extra) \ class _name TU_EXP _inherit { \ typedef _name self_t;/* -*/ TU_TYPEDEFS _variants/* */public:\ - enum Tag { \ + TU_TYPEDEFS _variants/* +*/ enum Tag { \ TU_TAGS _variants\ };/* */ private:\ |