summaryrefslogtreecommitdiff
path: root/src/hir_conv/bind.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-05-29 22:30:28 +0800
committerJohn Hodge <tpg@mutabah.net>2016-05-29 22:30:28 +0800
commit7890a6dba8fcdb9454b2e58ea1363f270d2da2c5 (patch)
treefa51d39712f552c78b390d61d19793c737d5238a /src/hir_conv/bind.cpp
parent73bcd2fb0bda8f939a6c1385b419a67ad8eeef2c (diff)
downloadmrust-7890a6dba8fcdb9454b2e58ea1363f270d2da2c5.tar.gz
Parse/AST/HIR - Support Enum::Var(..) and Struct { .. } patters properly
Diffstat (limited to 'src/hir_conv/bind.cpp')
-rw-r--r--src/hir_conv/bind.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/hir_conv/bind.cpp b/src/hir_conv/bind.cpp
index 948a3d75..97f52cc9 100644
--- a/src/hir_conv/bind.cpp
+++ b/src/hir_conv/bind.cpp
@@ -125,6 +125,18 @@ namespace {
fix_type_params(sp, str.m_params, e.path.m_params);
e.binding = &str;
),
+ (StructTupleWildcard,
+ const auto& str = *reinterpret_cast< const ::HIR::Struct*>( get_type_pointer(sp, m_crate, e.path.m_path, Target::Struct) );
+ TU_IFLET(::HIR::Struct::Data, str.m_data, Tuple, _,
+ // All good
+ )
+ else {
+ ERROR(sp, E0000, "Struct tuple pattern on non-tuple struct " << e.path);
+ }
+
+ fix_type_params(sp, str.m_params, e.path.m_params);
+ e.binding = &str;
+ ),
(Struct,
const auto& str = *reinterpret_cast< const ::HIR::Struct*>( get_type_pointer(sp, m_crate, e.path.m_path, Target::Struct) );
TU_IFLET(::HIR::Struct::Data, str.m_data, Named, _,
@@ -154,6 +166,24 @@ namespace {
e.binding_ptr = &enm;
e.binding_idx = idx;
),
+ (EnumTupleWildcard,
+ const auto& enm = *reinterpret_cast< const ::HIR::Enum*>( get_type_pointer(sp, m_crate, e.path.m_path, Target::EnumVariant) );
+ const auto& des_name = e.path.m_path.m_components.back();
+ unsigned int idx = ::std::find_if( enm.m_variants.begin(), enm.m_variants.end(), [&](const auto& x) { return x.first == des_name; }) - enm.m_variants.begin();
+ if( idx == enm.m_variants.size() ) {
+ ERROR(sp, E0000, "Couldn't find enum variant " << e.path);
+ }
+ const auto& var = enm.m_variants[idx].second;
+ TU_IFLET(::HIR::Enum::Variant, var, Tuple, _,
+ // All good
+ )
+ else {
+ ERROR(sp, E0000, "Enum tuple pattern on non-tuple variant " << e.path);
+ }
+ fix_type_params(sp, enm.m_params, e.path.m_params);
+ e.binding_ptr = &enm;
+ e.binding_idx = idx;
+ ),
(EnumStruct,
const auto& enm = *reinterpret_cast< const ::HIR::Enum*>( get_type_pointer(sp, m_crate, e.path.m_path, Target::EnumVariant) );
const auto& des_name = e.path.m_path.m_components.back();