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