summaryrefslogtreecommitdiff
path: root/src/hir
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2017-05-01 09:50:58 +0800
committerJohn Hodge <tpg@ucc.asn.au>2017-05-01 09:50:58 +0800
commitbc62d7864a0820bb612d00db605ec65fc542cbad (patch)
treef85ca4c87e85bc20499f7674c97c522abab52f81 /src/hir
parenta67157ddbbe91e089ad4bee572fb364acd9b3e75 (diff)
downloadmrust-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.cpp8
-rw-r--r--src/hir/hir.cpp24
-rw-r--r--src/hir/hir.hpp5
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
{