summaryrefslogtreecommitdiff
path: root/src/resolve/index.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/resolve/index.cpp')
-rw-r--r--src/resolve/index.cpp64
1 files changed, 36 insertions, 28 deletions
diff --git a/src/resolve/index.cpp b/src/resolve/index.cpp
index 48f2d0da..6051b82d 100644
--- a/src/resolve/index.cpp
+++ b/src/resolve/index.cpp
@@ -17,7 +17,7 @@ enum class IndexName
Value,
};
-void Resolve_Index_Module_Wildcard__use_stmt(AST::Crate& crate, AST::Module& dst_mod, const AST::UseStmt& i_data, bool is_pub);
+void Resolve_Index_Module_Wildcard__use_stmt(AST::Crate& crate, AST::Module& dst_mod, const AST::UseItem::Ent& i_data, bool is_pub);
::std::ostream& operator<<(::std::ostream& os, const IndexName& loc)
{
@@ -178,8 +178,8 @@ void Resolve_Index_Module_Base(const AST::Crate& crate, AST::Module& mod)
{
if( ! i.data.is_Use() )
continue ;
- const auto& i_data = i.data.as_Use();
- if( i.name != "" )
+ for(const auto& i_data : i.data.as_Use().entries)
+ if( i_data.name != "" )
{
// TODO: Ensure that the path is canonical?
@@ -190,47 +190,47 @@ void Resolve_Index_Module_Base(const AST::Crate& crate, AST::Module& mod)
// - Types
{TU_MATCH_HDRA( (i_data.path.m_bindings.type), {)
TU_ARMA(Unbound, _e) {
- DEBUG(i.name << " - Not a type/module");
+ DEBUG(i_data.name << " - Not a type/module");
}
TU_ARMA(TypeParameter, e)
BUG(sp, "Import was bound to type parameter");
TU_ARMA(Crate , e)
- _add_item(sp, mod, IndexName::Namespace, i.name, i.is_pub, i_data.path, !allow_collide);
+ _add_item(sp, mod, IndexName::Namespace, i_data.name, i.is_pub, i_data.path, !allow_collide);
TU_ARMA(Module, e)
- _add_item(sp, mod, IndexName::Namespace, i.name, i.is_pub, i_data.path, !allow_collide);
+ _add_item(sp, mod, IndexName::Namespace, i_data.name, i.is_pub, i_data.path, !allow_collide);
TU_ARMA(Enum, e)
- _add_item_type(sp, mod, i.name, i.is_pub, i_data.path, !allow_collide);
+ _add_item_type(sp, mod, i_data.name, i.is_pub, i_data.path, !allow_collide);
TU_ARMA(Union, e)
- _add_item_type(sp, mod, i.name, i.is_pub, i_data.path, !allow_collide);
+ _add_item_type(sp, mod, i_data.name, i.is_pub, i_data.path, !allow_collide);
TU_ARMA(Trait, e)
- _add_item_type(sp, mod, i.name, i.is_pub, i_data.path, !allow_collide);
+ _add_item_type(sp, mod, i_data.name, i.is_pub, i_data.path, !allow_collide);
TU_ARMA(TypeAlias, e)
- _add_item_type(sp, mod, i.name, i.is_pub, i_data.path, !allow_collide);
+ _add_item_type(sp, mod, i_data.name, i.is_pub, i_data.path, !allow_collide);
TU_ARMA(Struct, e)
- _add_item_type(sp, mod, i.name, i.is_pub, i_data.path, !allow_collide);
+ _add_item_type(sp, mod, i_data.name, i.is_pub, i_data.path, !allow_collide);
TU_ARMA(EnumVar, e)
- _add_item_type(sp, mod, i.name, i.is_pub, i_data.path, !allow_collide);
+ _add_item_type(sp, mod, i_data.name, i.is_pub, i_data.path, !allow_collide);
}}
// - Values
{TU_MATCH_HDRA( (i_data.path.m_bindings.value), {)
TU_ARMA(Unbound, _e) {
- DEBUG(i.name << " - Not a value");
+ DEBUG(i_data.name << " - Not a value");
}
TU_ARMA(Variable, e)
BUG(sp, "Import was bound to a variable");
TU_ARMA(Struct, e)
- _add_item_value(sp, mod, i.name, i.is_pub, i_data.path, !allow_collide);
+ _add_item_value(sp, mod, i_data.name, i.is_pub, i_data.path, !allow_collide);
TU_ARMA(EnumVar, e)
- _add_item_value(sp, mod, i.name, i.is_pub, i_data.path, !allow_collide);
+ _add_item_value(sp, mod, i_data.name, i.is_pub, i_data.path, !allow_collide);
TU_ARMA(Static , e)
- _add_item_value(sp, mod, i.name, i.is_pub, i_data.path, !allow_collide);
+ _add_item_value(sp, mod, i_data.name, i.is_pub, i_data.path, !allow_collide);
TU_ARMA(Function, e)
- _add_item_value(sp, mod, i.name, i.is_pub, i_data.path, !allow_collide);
+ _add_item_value(sp, mod, i_data.name, i.is_pub, i_data.path, !allow_collide);
}}
// - Macros
{TU_MATCH_HDRA( (i_data.path.m_bindings.macro), {)
TU_ARMA(Unbound, _e) {
- DEBUG(i.name << " - Not a macro");
+ DEBUG(i_data.name << " - Not a macro");
}
TU_ARMA(MacroRules, e) {
::std::vector<::std::string> path;
@@ -238,7 +238,7 @@ void Resolve_Index_Module_Base(const AST::Crate& crate, AST::Module& mod)
for(const auto& node : i_data.path.m_class.as_Absolute().nodes )
path.push_back( node.name() );
mod.m_macro_imports.push_back({
- i.is_pub, i.name, mv$(path), e.mac
+ i.is_pub, i_data.name, mv$(path), e.mac
});
}
// TODO: Other imports (e.g. derives, which have different naming structures)
@@ -411,16 +411,19 @@ void Resolve_Index_Module_Wildcard__submod(AST::Crate& crate, AST::Module& dst_m
{
if( ! i.data.is_Use() )
continue ;
- if( i.name != "" )
- continue ;
- Resolve_Index_Module_Wildcard__use_stmt(crate, dst_mod, i.data.as_Use(), import_as_pub);
+ for(const auto& e : i.data.as_Use().entries)
+ {
+ if( e.name != "" )
+ continue ;
+ Resolve_Index_Module_Wildcard__use_stmt(crate, dst_mod, e, import_as_pub);
+ }
}
}
stack.erase(&src_mod);
}
-void Resolve_Index_Module_Wildcard__use_stmt(AST::Crate& crate, AST::Module& dst_mod, const AST::UseStmt& i_data, bool is_pub)
+void Resolve_Index_Module_Wildcard__use_stmt(AST::Crate& crate, AST::Module& dst_mod, const AST::UseItem::Ent& i_data, bool is_pub)
{
const auto& sp = i_data.sp;
const auto& b = i_data.path.m_bindings.type;
@@ -443,7 +446,9 @@ void Resolve_Index_Module_Wildcard__use_stmt(AST::Crate& crate, AST::Module& dst
Resolve_Index_Module_Wildcard__submod(crate, dst_mod, *e.module_, is_pub);
}
)
- else TU_IFLET(::AST::PathBinding_Type, b, Enum, e,
+ else if( const auto* ep = b.opt_Enum() )
+ {
+ const auto& e = *ep;
ASSERT_BUG(sp, e.enum_ || e.hir, "Glob import but enum pointer not set - " << i_data.path);
if( e.enum_ )
{
@@ -500,7 +505,7 @@ void Resolve_Index_Module_Wildcard__use_stmt(AST::Crate& crate, AST::Module& dst
}
}
}
- )
+ }
else
{
BUG(sp, "Invalid path binding for glob import: " << b.tag_str() << " - "<<i_data.path);
@@ -522,9 +527,12 @@ void Resolve_Index_Module_Wildcard(AST::Crate& crate, AST::Module& mod)
{
if( ! i.data.is_Use() )
continue ;
- if( i.name != "" )
- continue ;
- Resolve_Index_Module_Wildcard__use_stmt(crate, mod, i.data.as_Use(), i.is_pub);
+ for(const auto& e : i.data.as_Use().entries )
+ {
+ if( e.name != "" )
+ continue ;
+ Resolve_Index_Module_Wildcard__use_stmt(crate, mod, e, i.is_pub);
+ }
}
// Mark this as having all the items it ever will.