diff options
author | John Hodge <tpg@mutabah.net> | 2015-03-26 20:45:12 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2015-03-26 20:45:12 +0800 |
commit | 3f78706378812a46e46fb0faba9eaf760ce80ffe (patch) | |
tree | 8862267beb1d918fd80f0d9e7e8fb8a27562b220 /src | |
parent | ab649f75cfe79fd91ca60f55fb93d9fe5c9e3a53 (diff) | |
download | mrust-3f78706378812a46e46fb0faba9eaf760ce80ffe.tar.gz |
Split out AST pattern code
Diffstat (limited to 'src')
-rw-r--r-- | src/ast/ast.cpp | 107 | ||||
-rw-r--r-- | src/ast/pattern.cpp | 123 |
2 files changed, 123 insertions, 107 deletions
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<TypeRef>& 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; + } +}); + +} + |