summaryrefslogtreecommitdiff
path: root/src/resolve/use.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2017-11-01 20:46:36 +0800
committerJohn Hodge <tpg@ucc.asn.au>2017-11-01 20:46:36 +0800
commitcb271f8ea98d1a5c65a5e636a0e73a85710027b4 (patch)
tree9694427c074c0e0d581cde6e01b6167016e0f844 /src/resolve/use.cpp
parent8306f43ccdf0414b48891aa5eb04d8901899c052 (diff)
downloadmrust-cb271f8ea98d1a5c65a5e636a0e73a85710027b4.tar.gz
HIR - Refactor enums to only embed a single field (and give variants types)
Diffstat (limited to 'src/resolve/use.cpp')
-rw-r--r--src/resolve/use.cpp25
1 files changed, 11 insertions, 14 deletions
diff --git a/src/resolve/use.cpp b/src/resolve/use.cpp
index 01a5d22c..e36e40a0 100644
--- a/src/resolve/use.cpp
+++ b/src/resolve/use.cpp
@@ -463,13 +463,10 @@ void Resolve_Use_Mod(const ::AST::Crate& crate, ::AST::Module& mod, ::AST::Path
}
else {
const auto& enm = *e.hir;
- unsigned int i = 0;
- for(const auto& var : enm.m_variants)
+ auto idx = enm.find_variant(des_item_name);
+ if( idx != SIZE_MAX )
{
- if( var.first == des_item_name ) {
- return ::AST::PathBinding::make_EnumVar({ nullptr, i, &enm });
- }
- i ++;
+ return ::AST::PathBinding::make_EnumVar({ nullptr, static_cast<unsigned>(idx), &enm });
}
}
)
@@ -564,11 +561,11 @@ namespace {
}
const auto& name = nodes[i].name();
- auto it2 = ::std::find_if( enm.m_variants.begin(), enm.m_variants.end(), [&](const auto& x){ return x.first == name; } );
- if( it2 == enm.m_variants.end() ) {
+ auto idx = enm.find_variant(name);
+ if( idx == SIZE_MAX ) {
ERROR(span, E0000, "Unable to find variant " << path);
}
- return ::AST::PathBinding::make_EnumVar({ nullptr, static_cast<unsigned int>(it2 - enm.m_variants.begin()), &enm });
+ return ::AST::PathBinding::make_EnumVar({ nullptr, static_cast<unsigned int>(idx), &enm });
}
else {
hmod = reinterpret_cast<const ::HIR::Module*>(ptr);
@@ -584,11 +581,11 @@ namespace {
}
const auto& name = nodes[i].name();
- auto it2 = ::std::find_if( e.m_variants.begin(), e.m_variants.end(), [&](const auto& x){ return x.first == name; } );
- if( it2 == e.m_variants.end() ) {
+ auto idx = e.find_variant(name);
+ if(idx == SIZE_MAX) {
ERROR(span, E0000, "Unable to find variant " << path);
}
- return ::AST::PathBinding::make_EnumVar({ nullptr, static_cast<unsigned int>(it2 - e.m_variants.begin()), &e });
+ return ::AST::PathBinding::make_EnumVar({ nullptr, static_cast<unsigned int>(idx), &e });
)
)
}
@@ -606,7 +603,7 @@ namespace {
auto p = e.path;
p.m_components.pop_back();
const auto& enm = ec.m_hir->get_typeitem_by_path(span, p, true).as_Enum();
- assert(e.idx < enm.m_variants.size());
+ assert(e.idx < enm.num_variants());
return ::AST::PathBinding::make_EnumVar({ nullptr, e.idx, &enm });
}
if( e.path.m_components.empty() )
@@ -653,7 +650,7 @@ namespace {
auto p = e.path;
p.m_components.pop_back();
const auto& enm = ec.m_hir->get_typeitem_by_path(span, p, true).as_Enum();
- assert(e.idx < enm.m_variants.size());
+ assert(e.idx < enm.num_variants());
return ::AST::PathBinding::make_EnumVar({ nullptr, e.idx, &enm });
}
item_ptr = &ec.m_hir->get_valitem_by_path(span, e.path, true); // ignore_crate_name=true