diff options
author | John Hodge <tpg@mutabah.net> | 2016-05-29 22:30:28 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-05-29 22:30:28 +0800 |
commit | 7890a6dba8fcdb9454b2e58ea1363f270d2da2c5 (patch) | |
tree | fa51d39712f552c78b390d61d19793c737d5238a /src/hir | |
parent | 73bcd2fb0bda8f939a6c1385b419a67ad8eeef2c (diff) | |
download | mrust-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.cpp | 33 | ||||
-rw-r--r-- | src/hir/pattern.hpp | 11 | ||||
-rw-r--r-- | src/hir/visitor.cpp | 6 |
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) |