From 3f78706378812a46e46fb0faba9eaf760ce80ffe Mon Sep 17 00:00:00 2001 From: John Hodge Date: Thu, 26 Mar 2015 20:45:12 +0800 Subject: Split out AST pattern code --- src/ast/ast.cpp | 107 --------------------------------------------- src/ast/pattern.cpp | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+), 107 deletions(-) create mode 100644 src/ast/pattern.cpp (limited to 'src') diff --git a/src/ast/ast.cpp b/src/ast/ast.cpp index 988762e6..11632996 100644 --- a/src/ast/ast.cpp +++ b/src/ast/ast.cpp @@ -38,113 +38,6 @@ SERIALISE_TYPE(MetaItem::, "AST_MetaItem", { s.item(m_sub_items); }) -::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; - } -}); Impl Impl::make_concrete(const ::std::vector& types) const { 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; + } +}); + +} + -- cgit v1.2.3