diff options
Diffstat (limited to 'src/ast')
-rw-r--r-- | src/ast/pattern.cpp | 17 | ||||
-rw-r--r-- | src/ast/pattern.hpp | 22 |
2 files changed, 20 insertions, 19 deletions
diff --git a/src/ast/pattern.cpp b/src/ast/pattern.cpp index bc961e63..06b96b48 100644 --- a/src/ast/pattern.cpp +++ b/src/ast/pattern.cpp @@ -59,12 +59,16 @@ namespace AST { } ::std::ostream& operator<<(::std::ostream& os, const Pattern::TuplePat& val) { - if( val.glob_pos == Pattern::TupleGlob::Start ) { + if( val.has_wildcard ) + { + os << val.start; os << ".., "; + os << val.end; } - os << val.sub_patterns; - if( val.glob_pos == Pattern::TupleGlob::End ) { - os << ".., "; + else + { + os << val.start; + assert(val.end.size() == 0); } return os; } @@ -169,8 +173,9 @@ AST::Pattern AST::Pattern::clone() const } static TuplePat clone_tup(const TuplePat& p) { return TuplePat { - p.glob_pos, - H::clone_list(p.sub_patterns) + H::clone_list(p.start), + p.has_wildcard, + H::clone_list(p.end) }; } static AST::Pattern::Value clone_val(const AST::Pattern::Value& v) { diff --git a/src/ast/pattern.hpp b/src/ast/pattern.hpp index 4db20fd5..687d1e34 100644 --- a/src/ast/pattern.hpp +++ b/src/ast/pattern.hpp @@ -60,14 +60,10 @@ public: (Named, Path) ); - enum class TupleGlob { - None, // (a, b) - Start, // (.., a, b) - End, // (a, b, ..) - }; struct TuplePat { - TupleGlob glob_pos; - ::std::vector<Pattern> sub_patterns; + ::std::vector<Pattern> start; + bool has_wildcard; + ::std::vector<Pattern> end; }; TAGGED_UNION(Data, Any, @@ -136,18 +132,18 @@ public: } struct TagTuple {}; - Pattern(TagTuple, TuplePat pat): - m_data( Data::make_Tuple( ::std::move(pat) ) ) - {} Pattern(TagTuple, ::std::vector<Pattern> pats): - m_data( Data::make_Tuple( TuplePat { TupleGlob::None, ::std::move(pats) } ) ) + m_data( Data::make_Tuple( TuplePat { mv$(pats), false, {} } ) ) + {} + Pattern(TagTuple, TuplePat pat): + m_data( Data::make_Tuple( mv$(pat) ) ) {} struct TagNamedTuple {}; Pattern(TagNamedTuple, Path path, ::std::vector<Pattern> pats): - m_data( Data::make_StructTuple( { ::std::move(path), TuplePat { TupleGlob::None, ::std::move(pats) } } ) ) + m_data( Data::make_StructTuple( { mv$(path), TuplePat { mv$(pats), false, {} } } ) ) {} - Pattern(TagNamedTuple, Path path, TuplePat pat = TuplePat { TupleGlob::Start, {} }): + Pattern(TagNamedTuple, Path path, TuplePat pat = TuplePat { {}, false, {} }): m_data( Data::make_StructTuple( { ::std::move(path), ::std::move(pat) } ) ) {} |