From 42b9b8616301e331e0a7d4bcfeaafa1b087a8362 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Mon, 16 May 2016 22:16:36 +0800 Subject: HIR - Ticking along - Generics hacked up, on to patterns --- src/hir/pattern.hpp | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) (limited to 'src/hir/pattern.hpp') diff --git a/src/hir/pattern.hpp b/src/hir/pattern.hpp index 4fa262ce..2ff0a0d2 100644 --- a/src/hir/pattern.hpp +++ b/src/hir/pattern.hpp @@ -2,9 +2,54 @@ */ #pragma once +#include +#include +#include +#include +#include + namespace HIR { -class Pattern { +struct PatternBinding +{ + ::std::string m_name; + unsigned int m_slot; + + bool is_valid() const { return m_name == ""; } +}; + +struct Pattern +{ + TAGGED_UNION(Value, String, + (Integer, struct { + enum ::HIR::CoreType type; + uint64_t value; // Signed numbers are encoded as 2's complement + }), + (String, ::std::string), + (Named, Path) + ); + + TAGGED_UNION(Data, Any, + (Any, struct { } ), + (Box, struct { ::std::unique_ptr sub; }), + (Ref, struct { bool mut; ::std::unique_ptr sub; } ), + (Value, struct { Value val; } ), + (Range, struct { Value start; Value end; } ), + (Tuple, struct { ::std::vector sub_patterns; } ), + (StructTuple, struct { GenericPath path; ::std::vector sub_patterns; } ), + (Struct, struct { GenericPath path; ::std::vector< ::std::pair< ::std::string, Pattern> > sub_patterns; } ), + (Slice, struct { + ::std::vector leading; + } ), + (SplitSlice, struct { + ::std::vector leading; + PatternBinding extra_bind; + ::std::vector trailing; + } ) + ); + + PatternBinding m_binding; + Data m_data; }; } -- cgit v1.2.3