diff options
Diffstat (limited to 'src/resolve')
-rw-r--r-- | src/resolve/absolute.cpp | 33 | ||||
-rw-r--r-- | src/resolve/index.cpp | 39 | ||||
-rw-r--r-- | src/resolve/use.cpp | 25 |
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 |