summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-09-01 12:05:18 +0800
committerJohn Hodge <tpg@mutabah.net>2016-09-01 12:05:18 +0800
commit0e84f7ae6f77001ddbb211f89e1f438b7fe96d6c (patch)
tree2e6364a03bf47ca41fb2b1ee153705535d9db7a2
parentdef3719f94f1bed17b6018975b9919c46ca43f16 (diff)
downloadmrust-0e84f7ae6f77001ddbb211f89e1f438b7fe96d6c.tar.gz
Resolve - HIR pointers for enum variants
-rw-r--r--src/ast/path.hpp7
-rw-r--r--src/hir/from_ast.cpp23
-rw-r--r--src/hir/from_ast_expr.cpp2
-rw-r--r--src/resolve/absolute.cpp2
4 files changed, 28 insertions, 6 deletions
diff --git a/src/ast/path.hpp b/src/ast/path.hpp
index f8a852c6..edc874bb 100644
--- a/src/ast/path.hpp
+++ b/src/ast/path.hpp
@@ -19,6 +19,9 @@ class TypeRef;
namespace HIR {
class Module;
class Trait;
+class Enum;
+class Struct;
+class Static;
} // namespace HIR
namespace AST {
@@ -46,9 +49,11 @@ TAGGED_UNION_EX(PathBinding, (), Unbound, (
}),
(Enum, struct {
const Enum* enum_;
+ const ::HIR::Enum* hir = nullptr;
}),
(Struct, struct {
const Struct* struct_;
+ const ::HIR::Struct* hir = nullptr;
}),
(Trait, struct {
const Trait* trait_;
@@ -56,6 +61,7 @@ TAGGED_UNION_EX(PathBinding, (), Unbound, (
}),
(Static, struct {
const Static* static_;
+ const ::HIR::Static* hir = nullptr; // if nullptr and static_ == nullptr, points to a `const`
}),
(Function, struct {
const Function* func_;
@@ -63,6 +69,7 @@ TAGGED_UNION_EX(PathBinding, (), Unbound, (
(EnumVar, struct {
const Enum* enum_;
unsigned int idx;
+ const ::HIR::Enum* hir = nullptr;
}),
(TypeAlias, struct {
const TypeAlias* alias_;
diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp
index 930c549f..dfe6b8ab 100644
--- a/src/hir/from_ast.cpp
+++ b/src/hir/from_ast.cpp
@@ -200,9 +200,16 @@
BUG(pat.span(), "Encountered StructTuple pattern not pointing to a enum variant or a struct - " << e.path);
),
(EnumVar,
- assert( pb.enum_ );
- const auto& var = pb.enum_->variants()[pb.idx].m_data;
- unsigned int field_count = var.as_Tuple().m_sub_types.size();
+ assert( pb.enum_ || pb.hir );
+ unsigned int field_count;
+ if( pb.enum_ ) {
+ const auto& var = pb.enum_->variants()[pb.idx].m_data;
+ field_count = var.as_Tuple().m_sub_types.size();
+ }
+ else {
+ const auto& var = pb.hir->m_variants.at(pb.idx).second;
+ field_count = var.as_Tuple().size();
+ }
::std::vector<HIR::Pattern> sub_patterns;
if( e.tup_pat.has_wildcard ) {
@@ -240,8 +247,14 @@
};
),
(Struct,
- assert( pb.struct_ );
- unsigned int field_count = pb.struct_->m_data.as_Tuple().ents.size();
+ assert( pb.struct_ || pb.hir );
+ unsigned int field_count;
+ if( pb.struct_ ) {
+ field_count = pb.struct_->m_data.as_Tuple().ents.size();
+ }
+ else {
+ field_count = pb.hir->m_data.as_Tuple().size();
+ }
::std::vector<HIR::Pattern> sub_patterns;
if( e.tup_pat.has_wildcard ) {
diff --git a/src/hir/from_ast_expr.cpp b/src/hir/from_ast_expr.cpp
index a2d0be99..186ec232 100644
--- a/src/hir/from_ast_expr.cpp
+++ b/src/hir/from_ast_expr.cpp
@@ -559,6 +559,7 @@ struct LowerHIR_ExprNode_Visitor:
m_rv.reset( new ::HIR::ExprNode_PathValue( v.span(), LowerHIR_Path(Span(v.get_pos()), v.m_path), ::HIR::ExprNode_PathValue::UNKNOWN ) );
),
(Struct,
+ assert( e.struct_ );
// TODO: Check the form and emit a PathValue if not a unit
if( e.struct_->m_data.is_Struct() ) {
// ERROR.
@@ -577,6 +578,7 @@ struct LowerHIR_ExprNode_Visitor:
m_rv.reset( new ::HIR::ExprNode_PathValue( v.span(), LowerHIR_Path(Span(v.get_pos()), v.m_path), ::HIR::ExprNode_PathValue::FUNCTION ) );
),
(Static,
+ assert( e.static_ );
if( e.static_->s_class() != ::AST::Static::CONST ) {
m_rv.reset( new ::HIR::ExprNode_PathValue( v.span(), LowerHIR_Path(Span(v.get_pos()), v.m_path), ::HIR::ExprNode_PathValue::STATIC ) );
}
diff --git a/src/resolve/absolute.cpp b/src/resolve/absolute.cpp
index 1457fa7e..ea919510 100644
--- a/src/resolve/absolute.cpp
+++ b/src/resolve/absolute.cpp
@@ -790,7 +790,7 @@ namespace {
ERROR(sp, E0000, "Type parameters were not expected here (enum params go on the variant)");
}
- path.bind( ::AST::PathBinding::make_EnumVar({nullptr, static_cast<unsigned int>(&var - &*e.m_variants.begin())}) );
+ path.bind( ::AST::PathBinding::make_EnumVar({nullptr, static_cast<unsigned int>(&var - &*e.m_variants.begin()), &e}) );
return;
}
}