summaryrefslogtreecommitdiff
path: root/src/hir/from_ast.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/hir/from_ast.cpp')
-rw-r--r--src/hir/from_ast.cpp212
1 files changed, 212 insertions, 0 deletions
diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp
index 82b7e489..b857ad67 100644
--- a/src/hir/from_ast.cpp
+++ b/src/hir/from_ast.cpp
@@ -58,6 +58,218 @@
::HIR::Pattern LowerHIR_Pattern(const ::AST::Pattern& pat)
{
+ ::HIR::PatternBinding binding;
+ if( pat.binding() != "" )
+ {
+ ::HIR::PatternBinding::Type bt;
+ switch(pat.binding_type())
+ {
+ case ::AST::Pattern::BIND_MOVE: bt = ::HIR::PatternBinding::Type::Move; break;
+ case ::AST::Pattern::BIND_REF: bt = ::HIR::PatternBinding::Type::Ref; break;
+ case ::AST::Pattern::BIND_MUTREF: bt = ::HIR::PatternBinding::Type::MutRef; break;
+ }
+ // TODO: Get bound slot
+ binding = ::HIR::PatternBinding(pat.binding_mut(), bt, pat.binding(), 0);
+ }
+ TU_MATCH(::AST::Pattern::Data, (pat.data()), (e),
+ (MaybeBind,
+ BUG(Span(), "Encountered MaybeBind pattern");
+ ),
+ (Macro,
+ BUG(Span(), "Encountered Macro pattern");
+ ),
+ (Any,
+ return ::HIR::Pattern {
+ mv$(binding),
+ ::HIR::Pattern::Data::make_Any({})
+ };
+ ),
+ (Box,
+ return ::HIR::Pattern {
+ mv$(binding),
+ ::HIR::Pattern::Data::make_Box({
+ box$(LowerHIR_Pattern( *e.sub ))
+ })
+ };
+ ),
+ (Ref,
+ return ::HIR::Pattern {
+ mv$(binding),
+ ::HIR::Pattern::Data::make_Ref({
+ (e.mut ? ::HIR::BorrowType::Unique : ::HIR::BorrowType::Shared),
+ box$(LowerHIR_Pattern( *e.sub ))
+ })
+ };
+ ),
+ (Tuple,
+ ::std::vector< ::HIR::Pattern> sub_patterns;
+ for(const auto& sp : e.sub_patterns)
+ sub_patterns.push_back( LowerHIR_Pattern(sp) );
+
+ return ::HIR::Pattern {
+ mv$(binding),
+ ::HIR::Pattern::Data::make_Tuple({
+ mv$(sub_patterns)
+ })
+ };
+ ),
+
+ (StructTuple,
+ ::std::vector< ::HIR::Pattern> sub_patterns;
+ for(const auto& sp : e.sub_patterns)
+ sub_patterns.push_back( LowerHIR_Pattern(sp) );
+
+ TU_MATCH_DEF(::AST::PathBinding, (e.path.binding()), (pb),
+ (
+ BUG(Span(), "Encountered StructTuple pattern not pointing to a enum variant or a struct");
+ ),
+ (EnumVar,
+ return ::HIR::Pattern {
+ mv$(binding),
+ ::HIR::Pattern::Data::make_EnumTuple({
+ LowerHIR_GenericPath(e.path),
+ mv$(sub_patterns)
+ })
+ };
+ ),
+ (Struct,
+ return ::HIR::Pattern {
+ mv$(binding),
+ ::HIR::Pattern::Data::make_StructTuple({
+ LowerHIR_GenericPath(e.path),
+ mv$(sub_patterns)
+ })
+ };
+ )
+ )
+ ),
+ (Struct,
+ ::std::vector< ::std::pair< ::std::string, ::HIR::Pattern> > sub_patterns;
+ for(const auto& sp : e.sub_patterns)
+ sub_patterns.push_back( ::std::make_pair(sp.first, LowerHIR_Pattern(sp.second)) );
+
+
+ TU_MATCH_DEF(::AST::PathBinding, (e.path.binding()), (pb),
+ (
+ BUG(Span(), "Encountered Struct pattern not pointing to a enum variant or a struct");
+ ),
+ (EnumVar,
+ return ::HIR::Pattern {
+ mv$(binding),
+ ::HIR::Pattern::Data::make_EnumStruct({
+ LowerHIR_GenericPath(e.path),
+ mv$(sub_patterns)
+ })
+ };
+ ),
+ (Struct,
+ return ::HIR::Pattern {
+ mv$(binding),
+ ::HIR::Pattern::Data::make_Struct({
+ LowerHIR_GenericPath(e.path),
+ mv$(sub_patterns)
+ })
+ };
+ )
+ )
+ ),
+
+ (Value,
+ struct H {
+ static ::HIR::CoreType get_int_type(const ::eCoreType ct) {
+ switch(ct)
+ {
+ case CORETYPE_ANY: return ::HIR::CoreType::Str;
+
+ case CORETYPE_I8 : return ::HIR::CoreType::I8;
+ case CORETYPE_U8 : return ::HIR::CoreType::U8;
+ case CORETYPE_I16: return ::HIR::CoreType::I16;
+ case CORETYPE_U16: return ::HIR::CoreType::U16;
+ case CORETYPE_I32: return ::HIR::CoreType::I32;
+ case CORETYPE_U32: return ::HIR::CoreType::U32;
+ case CORETYPE_I64: return ::HIR::CoreType::I64;
+ case CORETYPE_U64: return ::HIR::CoreType::U64;
+
+ case CORETYPE_INT: return ::HIR::CoreType::Isize;
+ case CORETYPE_UINT: return ::HIR::CoreType::Usize;
+ default:
+ BUG(Span(), "Unknown type for integer literal");
+ }
+ }
+ static ::HIR::Pattern::Value lowerhir_pattern_value(const ::AST::Pattern::Value& v) {
+ TU_MATCH(::AST::Pattern::Value, (v), (e),
+ (Invalid,
+ BUG(Span(), "Encountered Invalid value in Pattern");
+ ),
+ (Integer,
+ return ::HIR::Pattern::Value::make_Integer({
+ H::get_int_type(e.type),
+ e.value
+ });
+ ),
+ (String,
+ return ::HIR::Pattern::Value::make_String(e);
+ ),
+ (Named,
+ return ::HIR::Pattern::Value::make_Named( LowerHIR_Path(e) );
+ )
+ )
+ throw "BUGCHECK: Reached end of LowerHIR_Pattern::H::lowerhir_pattern_value";
+ }
+ };
+ if( e.end.is_Invalid() ) {
+ return ::HIR::Pattern {
+ mv$(binding),
+ ::HIR::Pattern::Data::make_Value({
+ H::lowerhir_pattern_value(e.start)
+ })
+ };
+ }
+ else {
+ return ::HIR::Pattern {
+ mv$(binding),
+ ::HIR::Pattern::Data::make_Range({
+ H::lowerhir_pattern_value(e.start),
+ H::lowerhir_pattern_value(e.end)
+ })
+ };
+ }
+ ),
+ (Slice,
+ ::std::vector< ::HIR::Pattern> leading;
+ for(const auto& sp : e.leading)
+ leading.push_back( LowerHIR_Pattern(sp) );
+
+ if( e.extra_bind != "" || e.trailing.size() > 0 ) {
+ ::std::vector< ::HIR::Pattern> trailing;
+ for(const auto& sp : e.trailing)
+ trailing.push_back( LowerHIR_Pattern(sp) );
+
+ auto extra_bind = (e.extra_bind == "_" || e.extra_bind == "")
+ ? ::HIR::PatternBinding()
+ // TODO: Get slot name for `extra_bind`
+ : ::HIR::PatternBinding(false, ::HIR::PatternBinding::Type::Ref, e.extra_bind, 0)
+ ;
+
+ return ::HIR::Pattern {
+ mv$(binding),
+ ::HIR::Pattern::Data::make_SplitSlice({
+ mv$(leading),
+ mv$(extra_bind),
+ mv$(trailing)
+ })
+ };
+ }
+ else {
+ return ::HIR::Pattern {
+ mv$(binding),
+ ::HIR::Pattern::Data::make_Slice({
+ mv$(leading)
+ })
+ };
+ }
+ )
+ )
throw ::std::runtime_error("TODO: LowerHIR_Pattern");
}