diff options
author | John Hodge <tpg@mutabah.net> | 2016-05-29 22:30:28 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-05-29 22:30:28 +0800 |
commit | 7890a6dba8fcdb9454b2e58ea1363f270d2da2c5 (patch) | |
tree | fa51d39712f552c78b390d61d19793c737d5238a /src/hir_conv/bind.cpp | |
parent | 73bcd2fb0bda8f939a6c1385b419a67ad8eeef2c (diff) | |
download | mrust-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.cpp | 30 |
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(); |