summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/hir/expr.hpp1
-rw-r--r--src/hir/from_ast_expr.cpp3
-rw-r--r--src/hir_typeck/expr_check.cpp2
-rw-r--r--src/hir_typeck/expr_cs.cpp22
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);