summaryrefslogtreecommitdiff
path: root/src/resolve
diff options
context:
space:
mode:
Diffstat (limited to 'src/resolve')
-rw-r--r--src/resolve/absolute.cpp33
-rw-r--r--src/resolve/index.cpp39
-rw-r--r--src/resolve/use.cpp25
3 files changed, 54 insertions, 43 deletions
diff --git a/src/resolve/absolute.cpp b/src/resolve/absolute.cpp
index e9cf274e..18412c27 100644
--- a/src/resolve/absolute.cpp
+++ b/src/resolve/absolute.cpp
@@ -702,10 +702,9 @@ namespace {
ERROR(sp, E0000, "Enum as path component in unexpected location - " << p);
}
const auto& varname = p.m_components.back();
- auto it = ::std::find_if( e.m_variants.begin(), e.m_variants.end(), [&](const auto&x){return x.first == varname;} );
- ASSERT_BUG(sp, it != e.m_variants.end(), "Extern crate import path points to non-present variant - " << p);
- unsigned int var_idx = it - e.m_variants.begin();
- auto pb = ::AST::PathBinding::make_EnumVar({nullptr, var_idx, &e});
+ auto var_idx = e.find_variant(varname);
+ ASSERT_BUG(sp, var_idx != SIZE_MAX, "Extern crate import path points to non-present variant - " << p);
+ auto pb = ::AST::PathBinding::make_EnumVar({nullptr, static_cast<unsigned>(var_idx), &e});
// Construct output path (with same set of parameters)
AST::Path rv( p.m_crate_name, {} );
@@ -901,22 +900,20 @@ namespace {
(Enum,
const auto& last_node = path_abs.nodes.back();
// If this refers to an enum variant, return the full path
- for( const auto& var : e.m_variants )
+ auto idx = e.find_variant(last_node.name());
+ if( idx != SIZE_MAX )
{
- if( var.first == last_node.name() ) {
-
- if( i != path_abs.nodes.size() - 2 ) {
- ERROR(sp, E0000, "Unexpected enum in path " << path);
- }
- // NOTE: Type parameters for enums go after the _variant_
- if( ! n.args().is_empty() ) {
- ERROR(sp, E0000, "Type parameters were not expected here (enum params go on the variant)");
- }
-
- path.bind( ::AST::PathBinding::make_EnumVar({nullptr, static_cast<unsigned int>(&var - &*e.m_variants.begin()), &e}) );
- path = split_into_crate(sp, mv$(path), start, crate.m_name);
- return;
+ if( i != path_abs.nodes.size() - 2 ) {
+ ERROR(sp, E0000, "Unexpected enum in path " << path);
+ }
+ // NOTE: Type parameters for enums go after the _variant_
+ if( ! n.args().is_empty() ) {
+ ERROR(sp, E0000, "Type parameters were not expected here (enum params go on the variant)");
}
+
+ path.bind( ::AST::PathBinding::make_EnumVar({nullptr, static_cast<unsigned int>(idx), &e}) );
+ path = split_into_crate(sp, mv$(path), start, crate.m_name);
+ return;
}
path = split_into_crate(sp, mv$(path), start, crate.m_name);
path = split_into_ufcs_ty(sp, mv$(path), i-start);
diff --git a/src/resolve/index.cpp b/src/resolve/index.cpp
index 2f4ece59..458aed5e 100644
--- a/src/resolve/index.cpp
+++ b/src/resolve/index.cpp
@@ -223,8 +223,8 @@ void Resolve_Index_Module_Base(const AST::Crate& crate, AST::Module& mod)
is_struct = e.enum_->variants().at(e.idx).m_data.is_Struct();
}
else {
- ASSERT_BUG(sp, e.idx < e.hir->m_variants.size(), "Variant out of range for " << i_data.path);
- is_struct = e.hir->m_variants.at(e.idx).second.is_Struct();
+ //ASSERT_BUG(sp, e.idx < e.hir->m_variants.size(), "Variant out of range for " << i_data.path);
+ is_struct = TU_TEST1(e.hir->m_data, Data, .at(e.idx).is_struct);
}
if( is_struct )
_add_item_type(sp, mod, i.name, i.is_pub, i_data.path, !allow_collide);
@@ -457,19 +457,36 @@ void Resolve_Index_Module_Wildcard__use_stmt(AST::Crate& crate, AST::Module& dst
{
DEBUG("Glob enum " << i_data.path << " (HIR)");
unsigned int idx = 0;
- for( const auto& ev : e.hir->m_variants )
+ if( e.hir->m_data.is_Value() )
{
- ::AST::Path p = i_data.path + ev.first;
- p.bind( ::AST::PathBinding::make_EnumVar({nullptr, idx, e.hir}) );
+ const auto* de = e.hir->m_data.opt_Value();
+ for(const auto& ev : de->variants)
+ {
+ ::AST::Path p = i_data.path + ev.name;
+ p.bind( ::AST::PathBinding::make_EnumVar({nullptr, idx, e.hir}) );
- if( ev.second.is_Struct() ) {
- _add_item_type ( sp, dst_mod, ev.first, is_pub, mv$(p), false );
- }
- else {
- _add_item_value( sp, dst_mod, ev.first, is_pub, mv$(p), false );
+ _add_item_value( sp, dst_mod, ev.name, is_pub, mv$(p), false );
+
+ idx += 1;
}
+ }
+ else
+ {
+ const auto* de = &e.hir->m_data.as_Data();
+ for(const auto& ev : *de)
+ {
+ ::AST::Path p = i_data.path + ev.name;
+ p.bind( ::AST::PathBinding::make_EnumVar({nullptr, idx, e.hir}) );
- idx += 1;
+ if( ev.is_struct ) {
+ _add_item_type ( sp, dst_mod, ev.name, is_pub, mv$(p), false );
+ }
+ else {
+ _add_item_value( sp, dst_mod, ev.name, is_pub, mv$(p), false );
+ }
+
+ idx += 1;
+ }
}
}
)
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