summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/hir/from_ast.cpp99
-rw-r--r--src/hir/type.cpp5
-rw-r--r--src/hir/type.hpp42
-rw-r--r--src/include/tagged_union.hpp4
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:\