summaryrefslogtreecommitdiff
path: root/src/hir
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-05-29 22:30:28 +0800
committerJohn Hodge <tpg@mutabah.net>2016-05-29 22:30:28 +0800
commit7890a6dba8fcdb9454b2e58ea1363f270d2da2c5 (patch)
treefa51d39712f552c78b390d61d19793c737d5238a /src/hir
parent73bcd2fb0bda8f939a6c1385b419a67ad8eeef2c (diff)
downloadmrust-7890a6dba8fcdb9454b2e58ea1363f270d2da2c5.tar.gz
Parse/AST/HIR - Support Enum::Var(..) and Struct { .. } patters properly
Diffstat (limited to 'src/hir')
-rw-r--r--src/hir/from_ast.cpp33
-rw-r--r--src/hir/pattern.hpp11
-rw-r--r--src/hir/visitor.cpp6
3 files changed, 48 insertions, 2 deletions
diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp
index a3584663..8681a078 100644
--- a/src/hir/from_ast.cpp
+++ b/src/hir/from_ast.cpp
@@ -88,6 +88,8 @@
::HIR::Pattern LowerHIR_Pattern(const ::AST::Pattern& pat)
{
+ TRACE_FUNCTION_F("@" << pat.span().filename << ":" << pat.span().start_line << " pat = " << pat);
+
::HIR::PatternBinding binding;
if( pat.binding() != "" )
{
@@ -144,6 +146,31 @@
};
),
+ (WildcardStructTuple,
+ TU_MATCH_DEF(::AST::PathBinding, (e.path.binding()), (pb),
+ (
+ BUG(pat.span(), "Encountered StructTuple pattern not pointing to a enum variant or a struct - " << e.path);
+ ),
+ (EnumVar,
+ return ::HIR::Pattern {
+ mv$(binding),
+ ::HIR::Pattern::Data::make_EnumTupleWildcard({
+ LowerHIR_GenericPath(pat.span(), e.path),
+ nullptr, 0
+ })
+ };
+ ),
+ (Struct,
+ return ::HIR::Pattern {
+ mv$(binding),
+ ::HIR::Pattern::Data::make_StructTupleWildcard({
+ LowerHIR_GenericPath(pat.span(), e.path),
+ nullptr
+ })
+ };
+ )
+ )
+ ),
(StructTuple,
::std::vector< ::HIR::Pattern> sub_patterns;
for(const auto& sp : e.sub_patterns)
@@ -191,7 +218,8 @@
::HIR::Pattern::Data::make_EnumStruct({
LowerHIR_GenericPath(pat.span(), e.path),
nullptr, 0,
- mv$(sub_patterns)
+ mv$(sub_patterns),
+ e.is_exhaustive
})
};
),
@@ -201,7 +229,8 @@
::HIR::Pattern::Data::make_Struct({
LowerHIR_GenericPath(pat.span(), e.path),
nullptr,
- mv$(sub_patterns)
+ mv$(sub_patterns),
+ e.is_exhaustive
})
};
)
diff --git a/src/hir/pattern.hpp b/src/hir/pattern.hpp
index fc763f54..c7b0fe7d 100644
--- a/src/hir/pattern.hpp
+++ b/src/hir/pattern.hpp
@@ -65,10 +65,15 @@ struct Pattern
const Struct* binding;
::std::vector<Pattern> sub_patterns;
} ),
+ (StructTupleWildcard, struct {
+ GenericPath path;
+ const Struct* binding;
+ }),
(Struct, struct {
GenericPath path;
const Struct* binding;
::std::vector< ::std::pair< ::std::string, Pattern> > sub_patterns;
+ bool is_exhaustive;
} ),
// Refutable
(Value, struct { Value val; } ),
@@ -79,11 +84,17 @@ struct Pattern
unsigned binding_idx;
::std::vector<Pattern> sub_patterns;
} ),
+ (EnumTupleWildcard, struct {
+ GenericPath path;
+ const Enum* binding_ptr;
+ unsigned binding_idx;
+ } ),
(EnumStruct, struct {
GenericPath path;
const Enum* binding_ptr;
unsigned binding_idx;
::std::vector< ::std::pair< ::std::string, Pattern> > sub_patterns;
+ bool is_exhaustive;
} ),
(Slice, struct {
::std::vector<Pattern> sub_patterns;
diff --git a/src/hir/visitor.cpp b/src/hir/visitor.cpp
index 33ac6505..23acf4e4 100644
--- a/src/hir/visitor.cpp
+++ b/src/hir/visitor.cpp
@@ -300,6 +300,9 @@ void ::HIR::Visitor::visit_pattern(::HIR::Pattern& pat)
for(auto& sp : e.sub_patterns)
this->visit_pattern(sp);
),
+ (StructTupleWildcard,
+ this->visit_generic_path(e.path, ::HIR::Visitor::PathContext::TYPE);
+ ),
(StructTuple,
this->visit_generic_path(e.path, ::HIR::Visitor::PathContext::TYPE);
for(auto& sp : e.sub_patterns)
@@ -318,6 +321,9 @@ void ::HIR::Visitor::visit_pattern(::HIR::Pattern& pat)
this->visit_pattern_val(e.start);
this->visit_pattern_val(e.end);
),
+ (EnumTupleWildcard,
+ this->visit_generic_path(e.path, ::HIR::Visitor::PathContext::TYPE);
+ ),
(EnumTuple,
this->visit_generic_path(e.path, ::HIR::Visitor::PathContext::TYPE);
for(auto& sp : e.sub_patterns)