summaryrefslogtreecommitdiff
path: root/src/hir/pattern.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/hir/pattern.hpp')
-rw-r--r--src/hir/pattern.hpp33
1 files changed, 29 insertions, 4 deletions
diff --git a/src/hir/pattern.hpp b/src/hir/pattern.hpp
index 2ff0a0d2..4d7668f6 100644
--- a/src/hir/pattern.hpp
+++ b/src/hir/pattern.hpp
@@ -12,10 +12,31 @@ namespace HIR {
struct PatternBinding
{
+ enum class Type {
+ Move,
+ Ref,
+ MutRef,
+ };
+
+ bool m_mutable;
+ Type m_type;
::std::string m_name;
unsigned int m_slot;
bool is_valid() const { return m_name == ""; }
+
+ PatternBinding():
+ m_mutable(false),
+ m_type(Type::Move),
+ m_name(""),
+ m_slot(0)
+ {}
+ PatternBinding(bool mut, Type type, ::std::string name, unsigned int slot):
+ m_mutable(mut),
+ m_type(type),
+ m_name( mv$(name) ),
+ m_slot( slot )
+ {}
};
struct Pattern
@@ -30,16 +51,20 @@ struct Pattern
);
TAGGED_UNION(Data, Any,
+ // Irrefutable / destructuring
(Any, struct { } ),
(Box, struct { ::std::unique_ptr<Pattern> sub; }),
- (Ref, struct { bool mut; ::std::unique_ptr<Pattern> sub; } ),
- (Value, struct { Value val; } ),
- (Range, struct { Value start; Value end; } ),
+ (Ref, struct { ::HIR::BorrowType type; ::std::unique_ptr<Pattern> sub; } ),
(Tuple, struct { ::std::vector<Pattern> sub_patterns; } ),
(StructTuple, struct { GenericPath path; ::std::vector<Pattern> sub_patterns; } ),
(Struct, struct { GenericPath path; ::std::vector< ::std::pair< ::std::string, Pattern> > sub_patterns; } ),
+ // Refutable
+ (Value, struct { Value val; } ),
+ (Range, struct { Value start; Value end; } ),
+ (EnumTuple, struct { GenericPath path; ::std::vector<Pattern> sub_patterns; } ),
+ (EnumStruct, struct { GenericPath path; ::std::vector< ::std::pair< ::std::string, Pattern> > sub_patterns; } ),
(Slice, struct {
- ::std::vector<Pattern> leading;
+ ::std::vector<Pattern> sub_patterns;
} ),
(SplitSlice, struct {
::std::vector<Pattern> leading;