diff options
author | John Hodge <tpg@ucc.asn.au> | 2017-05-01 09:50:58 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2017-05-01 09:50:58 +0800 |
commit | bc62d7864a0820bb612d00db605ec65fc542cbad (patch) | |
tree | f85ca4c87e85bc20499f7674c97c522abab52f81 /src/hir | |
parent | a67157ddbbe91e089ad4bee572fb364acd9b3e75 (diff) | |
download | mrust-bc62d7864a0820bb612d00db605ec65fc542cbad.tar.gz |
HIR - Rough support for enum variant values (trans only, no consteval)
Diffstat (limited to 'src/hir')
-rw-r--r-- | src/hir/dump.cpp | 8 | ||||
-rw-r--r-- | src/hir/hir.cpp | 24 | ||||
-rw-r--r-- | src/hir/hir.hpp | 5 |
3 files changed, 36 insertions, 1 deletions
diff --git a/src/hir/dump.cpp b/src/hir/dump.cpp index 7e877a4f..614e95eb 100644 --- a/src/hir/dump.cpp +++ b/src/hir/dump.cpp @@ -165,7 +165,13 @@ namespace { (Unit, ), (Value, - m_os << " = ?";// << + m_os << " = "; + if( e.val.is_Invalid() ) { + m_os << "?"; + } + else { + m_os << e.val; + } ), (Tuple, m_os << "("; diff --git a/src/hir/hir.cpp b/src/hir/hir.cpp index 66dc0e0b..ce80e43c 100644 --- a/src/hir/hir.cpp +++ b/src/hir/hir.cpp @@ -93,6 +93,30 @@ const ::HIR::Enum::Variant* ::HIR::Enum::get_variant(const ::std::string& name) return nullptr; return &it->second; } +bool HIR::Enum::is_value() const +{ + return this->m_repr != ::HIR::Enum::Repr::Rust || ::std::all_of(m_variants.begin(), m_variants.end(), [](const auto& x){return x.second.is_Unit() || x.second.is_Value();}); +} +uint32_t HIR::Enum::get_value(size_t idx) const +{ + assert(idx < m_variants.size()); + + if( const auto* e = m_variants[idx].second.opt_Value() ) + { + return e->val.as_Integer(); + } + + uint32_t val = 0; + for(size_t i = 0; i < idx; i ++) + { + if( const auto* e = m_variants[i].second.opt_Value() ) + { + val = e->val.as_Integer(); + } + val ++; + } + return val; +} namespace { bool matches_genericpath(const ::HIR::GenericParams& params, const ::HIR::GenericPath& left, const ::HIR::GenericPath& right, ::HIR::t_cb_resolve_type ty_res, bool expand_generic); diff --git a/src/hir/hir.hpp b/src/hir/hir.hpp index b87385a0..b7d116e3 100644 --- a/src/hir/hir.hpp +++ b/src/hir/hir.hpp @@ -218,6 +218,11 @@ public: TraitMarkings m_markings; const Variant* get_variant(const ::std::string& ) const; + + /// Returns true if this enum is a C-like enum (has values only) + bool is_value() const; + /// Returns the value for the given variant + uint32_t get_value(size_t variant) const; }; class Struct { |