summaryrefslogtreecommitdiff
path: root/src/ast
diff options
context:
space:
mode:
Diffstat (limited to 'src/ast')
-rw-r--r--src/ast/pattern.cpp12
-rw-r--r--src/ast/pattern.hpp10
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 {};