diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/hir/expr.hpp | 1 | ||||
-rw-r--r-- | src/hir/from_ast_expr.cpp | 3 | ||||
-rw-r--r-- | src/hir_typeck/expr_check.cpp | 2 | ||||
-rw-r--r-- | src/hir_typeck/expr_cs.cpp | 22 |
4 files changed, 26 insertions, 2 deletions
diff --git a/src/hir/expr.hpp b/src/hir/expr.hpp index d1a86c4e..d3bc8ad0 100644 --- a/src/hir/expr.hpp +++ b/src/hir/expr.hpp @@ -636,6 +636,7 @@ struct ExprNode_PathValue: UNKNOWN, FUNCTION, STRUCT_CONSTR, + ENUM_VAR_CONSTR, STATIC, CONSTANT, }; diff --git a/src/hir/from_ast_expr.cpp b/src/hir/from_ast_expr.cpp index 7f72e35c..b3251e20 100644 --- a/src/hir/from_ast_expr.cpp +++ b/src/hir/from_ast_expr.cpp @@ -632,8 +632,7 @@ struct LowerHIR_ExprNode_Visitor: } (void)var_idx; // TODO: Save time later by saving this. if( is_tuple_constructor ) { - TODO(v.span(), "Yield _PathValue when a tuple-like enum variant path is used as a value"); - //m_rv.reset( new ::HIR::ExprNode_PathValue( v.span(), LowerHIR_Path(Span(v.get_pos()), v.m_path), ::HIR::ExprNode_PathValue::ENUM_VAR_CONSTR ) ); + m_rv.reset( new ::HIR::ExprNode_PathValue( v.span(), LowerHIR_Path(Span(v.get_pos()), v.m_path), ::HIR::ExprNode_PathValue::ENUM_VAR_CONSTR ) ); } else { m_rv.reset( new ::HIR::ExprNode_UnitVariant( v.span(), LowerHIR_GenericPath(Span(v.get_pos()), v.m_path), false ) ); diff --git a/src/hir_typeck/expr_check.cpp b/src/hir_typeck/expr_check.cpp index 0b700c5d..2f962f71 100644 --- a/src/hir_typeck/expr_check.cpp +++ b/src/hir_typeck/expr_check.cpp @@ -872,6 +872,8 @@ namespace { break; case ::HIR::ExprNode_PathValue::STRUCT_CONSTR: { } break; + case ::HIR::ExprNode_PathValue::ENUM_VAR_CONSTR: { + } break; case ::HIR::ExprNode_PathValue::STATIC: { } break; case ::HIR::ExprNode_PathValue::CONSTANT: { diff --git a/src/hir_typeck/expr_cs.cpp b/src/hir_typeck/expr_cs.cpp index e37f8a8a..abe418a7 100644 --- a/src/hir_typeck/expr_cs.cpp +++ b/src/hir_typeck/expr_cs.cpp @@ -1393,6 +1393,28 @@ namespace { auto ty = ::HIR::TypeRef( ::HIR::TypeRef::Data::make_Function(mv$(ft)) ); this->context.equate_types(sp, node.m_res_type, ty); } break; + case ::HIR::ExprNode_PathValue::ENUM_VAR_CONSTR: { + const auto& var_name = e.m_path.m_components.back(); + auto enum_path = e.m_path; + enum_path.m_components.pop_back(); + const auto& enm = this->context.m_crate.get_enum_by_path(sp, enum_path); + const auto& var = *::std::find_if(enm.m_variants.begin(), enm.m_variants.end(), [&](const auto&x){ return x.first == var_name; }); + const auto& var_data = var.second.as_Tuple(); + + ::HIR::FunctionType ft { + false, + "rust", + box$( ::HIR::TypeRef( ::HIR::GenericPath(mv$(enum_path), e.m_params.clone()), ::HIR::TypeRef::TypePathBinding::make_Enum(&enm) ) ), + {} + }; + for( const auto& arg : var_data ) + { + ft.m_arg_types.push_back( monomorphise_type(sp, enm.m_params, e.m_params, arg.ent) ); + } + + auto ty = ::HIR::TypeRef( ::HIR::TypeRef::Data::make_Function(mv$(ft)) ); + this->context.equate_types(sp, node.m_res_type, ty); + } break; case ::HIR::ExprNode_PathValue::STATIC: { const auto& v = this->context.m_crate.get_static_by_path(sp, e.m_path); DEBUG("static v.m_type = " << v.m_type); |