diff options
Diffstat (limited to 'src/ast/pattern.cpp')
-rw-r--r-- | src/ast/pattern.cpp | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/src/ast/pattern.cpp b/src/ast/pattern.cpp new file mode 100644 index 00000000..cc5153cb --- /dev/null +++ b/src/ast/pattern.cpp @@ -0,0 +1,123 @@ +/* + * MRustC - Rust Compiler + * - By John Hodge (Mutabah/thePowersGang) + * + * ast/pattern.cpp + * - AST::Pattern support/implementation code + */ +#include "../common.hpp" +#include "ast.hpp" +#include "pattern.hpp" + +namespace AST { + +::std::ostream& operator<<(::std::ostream& os, const Pattern& pat) +{ + os << "Pattern(" << pat.m_binding << " @ "; + switch(pat.m_data.tag()) + { + case Pattern::Data::Any: + os << "_"; + break; + case Pattern::Data::MaybeBind: + os << "?"; + break; + case Pattern::Data::Ref: + os << "&" << (pat.m_data.as_Ref().mut ? "mut " : "") << *pat.m_data.as_Ref().sub; + break; + case Pattern::Data::Value: + os << *pat.m_data.as_Value().start; + if( pat.m_data.as_Value().end.get() ) + os << " ... " << *pat.m_data.as_Value().end; + break; + case Pattern::Data::Tuple: + os << "(" << pat.m_data.as_Tuple().sub_patterns << ")"; + break; + case Pattern::Data::StructTuple: + os << pat.m_data.as_StructTuple().path << " (" << pat.m_data.as_StructTuple().sub_patterns << ")"; + break; + case Pattern::Data::Struct: + os << pat.m_data.as_Struct().path << " {" << pat.m_data.as_Struct().sub_patterns << "}"; + break; + } + os << ")"; + return os; +} +void operator%(Serialiser& s, Pattern::Data::Tag c) { + s << Pattern::Data::tag_to_str(c); +} +void operator%(::Deserialiser& s, Pattern::Data::Tag& c) { + ::std::string n; + s.item(n); + c = Pattern::Data::tag_from_str(n); +} +SERIALISE_TYPE(Pattern::, "Pattern", { + s.item(m_binding); + s % m_data.tag(); + switch(m_data.tag()) + { + case Pattern::Data::Any: + break; + case Pattern::Data::MaybeBind: + break; + case Pattern::Data::Ref: + s << m_data.as_Ref().mut; + s << m_data.as_Ref().sub; + break; + case Pattern::Data::Value: + s << m_data.as_Value().start; + s << m_data.as_Value().end; + break; + case Pattern::Data::Tuple: + s << m_data.as_Tuple().sub_patterns; + break; + case Pattern::Data::StructTuple: + s << m_data.as_StructTuple().path; + s << m_data.as_StructTuple().sub_patterns; + break; + case Pattern::Data::Struct: + s << m_data.as_Struct().path; + s << m_data.as_Struct().sub_patterns; + break; + } +},{ + s.item(m_binding); + Pattern::Data::Tag tag; + s % tag; + switch(tag) + { + case Pattern::Data::Any: + m_data = Pattern::Data::make_null_Any(); + break; + case Pattern::Data::MaybeBind: + m_data = Pattern::Data::make_null_MaybeBind(); + break; + case Pattern::Data::Ref: + m_data = Pattern::Data::make_null_Ref(); + s.item( m_data.as_Ref().mut ); + s.item( m_data.as_Ref().sub ); + break; + case Pattern::Data::Value: + m_data = Pattern::Data::make_null_Value(); + s.item( m_data.as_Value().start ); + s.item( m_data.as_Value().end ); + break; + case Pattern::Data::Tuple: + m_data = Pattern::Data::make_null_Tuple(); + s.item( m_data.as_Tuple().sub_patterns ); + break; + case Pattern::Data::StructTuple: + m_data = Pattern::Data::make_null_StructTuple(); + s.item( m_data.as_StructTuple().path ); + s.item( m_data.as_StructTuple().sub_patterns ); + break; + case Pattern::Data::Struct: + m_data = Pattern::Data::make_null_Struct(); + s.item( m_data.as_Struct().path ); + s.item( m_data.as_Struct().sub_patterns ); + break; + } +}); + +} + |