diff options
Diffstat (limited to 'src/ast')
-rw-r--r-- | src/ast/pattern.cpp | 12 | ||||
-rw-r--r-- | src/ast/pattern.hpp | 10 |
2 files changed, 19 insertions, 3 deletions
diff --git a/src/ast/pattern.cpp b/src/ast/pattern.cpp index ca5378e1..9e17abcf 100644 --- a/src/ast/pattern.cpp +++ b/src/ast/pattern.cpp @@ -70,6 +70,9 @@ namespace AST { (Tuple, os << "(" << ent.sub_patterns << ")"; ), + (WildcardStructTuple, + os << ent.path << " (..)"; + ), (StructTuple, os << ent.path << " (" << ent.sub_patterns << ")"; ), @@ -220,6 +223,9 @@ AST::Pattern AST::Pattern::clone() const (Tuple, rv.m_data = Data::make_Tuple({ H::clone_list(e.sub_patterns) }); ), + (WildcardStructTuple, + rv.m_data = Data::make_WildcardStructTuple({ ::AST::Path(e.path) }); + ), (StructTuple, rv.m_data = Data::make_StructTuple({ ::AST::Path(e.path), H::clone_list(e.sub_patterns) }); ), @@ -263,6 +269,9 @@ SERIALISE_TYPE(Pattern::, "Pattern", { (Tuple, s << e.sub_patterns; ), + (WildcardStructTuple, + s << e.path; + ), (StructTuple, s << e.path; s << e.sub_patterns; @@ -304,6 +313,9 @@ SERIALISE_TYPE(Pattern::, "Pattern", { _D(Tuple, s.item( ent.sub_patterns ); ) + _D(WildcardStructTuple, + s.item( ent.path ); + ) _D(StructTuple, s.item( ent.path ); s.item( ent.sub_patterns ); diff --git a/src/ast/pattern.hpp b/src/ast/pattern.hpp index 79d349c2..699ed466 100644 --- a/src/ast/pattern.hpp +++ b/src/ast/pattern.hpp @@ -40,8 +40,9 @@ public: (Ref, struct { bool mut; unique_ptr<Pattern> sub; } ), (Value, struct { Value start; Value end; } ), (Tuple, struct { ::std::vector<Pattern> sub_patterns; } ), + (WildcardStructTuple, struct { Path path; } ), (StructTuple, struct { Path path; ::std::vector<Pattern> sub_patterns; } ), - (Struct, struct { Path path; ::std::vector< ::std::pair< ::std::string, Pattern> > sub_patterns; } ), + (Struct, struct { Path path; ::std::vector< ::std::pair< ::std::string, Pattern> > sub_patterns; bool is_exhaustive; } ), (Slice, struct { ::std::vector<Pattern> leading; ::std::string extra_bind; ::std::vector<Pattern> trailing; } ) ); private: @@ -110,13 +111,16 @@ public: {} struct TagEnumVariant {}; + Pattern(TagEnumVariant, Path path): + m_data( Data::make_WildcardStructTuple( { ::std::move(path) } ) ) + {} Pattern(TagEnumVariant, Path path, ::std::vector<Pattern> sub_patterns): m_data( Data::make_StructTuple( { ::std::move(path), ::std::move(sub_patterns) } ) ) {} struct TagStruct {}; - Pattern(TagStruct, Path path, ::std::vector< ::std::pair< ::std::string,Pattern> > sub_patterns): - m_data( Data::make_Struct( { ::std::move(path), ::std::move(sub_patterns) } ) ) + Pattern(TagStruct, Path path, ::std::vector< ::std::pair< ::std::string,Pattern> > sub_patterns, bool is_exhaustive): + m_data( Data::make_Struct( { ::std::move(path), ::std::move(sub_patterns), is_exhaustive } ) ) {} struct TagSlice {}; |