diff options
author | John Hodge <tpg@mutabah.net> | 2016-09-01 12:05:18 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-09-01 12:05:18 +0800 |
commit | 0e84f7ae6f77001ddbb211f89e1f438b7fe96d6c (patch) | |
tree | 2e6364a03bf47ca41fb2b1ee153705535d9db7a2 | |
parent | def3719f94f1bed17b6018975b9919c46ca43f16 (diff) | |
download | mrust-0e84f7ae6f77001ddbb211f89e1f438b7fe96d6c.tar.gz |
Resolve - HIR pointers for enum variants
-rw-r--r-- | src/ast/path.hpp | 7 | ||||
-rw-r--r-- | src/hir/from_ast.cpp | 23 | ||||
-rw-r--r-- | src/hir/from_ast_expr.cpp | 2 | ||||
-rw-r--r-- | src/resolve/absolute.cpp | 2 |
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; } } |