summaryrefslogtreecommitdiff
path: root/src/hir/visitor.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-06-05 20:37:45 +0800
committerJohn Hodge <tpg@mutabah.net>2016-06-05 20:37:45 +0800
commit52eb59ef0e0eedb8ea4da2210c5357245e523dfd (patch)
tree5f2a1483b0a1dd3ce3f0b1edaab8d55b90be276d /src/hir/visitor.cpp
parente3f35882f8240e506e34bb37c8fef1ca34601882 (diff)
downloadmrust-52eb59ef0e0eedb8ea4da2210c5357245e523dfd.tar.gz
Resolve - UFCS resolution expanded to handle `Self` and params
Diffstat (limited to 'src/hir/visitor.cpp')
-rw-r--r--src/hir/visitor.cpp46
1 files changed, 24 insertions, 22 deletions
diff --git a/src/hir/visitor.cpp b/src/hir/visitor.cpp
index d2ee9f74..d4eeec50 100644
--- a/src/hir/visitor.cpp
+++ b/src/hir/visitor.cpp
@@ -8,7 +8,7 @@
void ::HIR::Visitor::visit_crate(::HIR::Crate& crate)
{
- this->visit_module( crate.m_root_module );
+ this->visit_module(::HIR::PathChain(""), crate.m_root_module );
for( auto& ty_impl : crate.m_type_impls )
{
@@ -24,7 +24,7 @@ void ::HIR::Visitor::visit_crate(::HIR::Crate& crate)
}
}
-void ::HIR::Visitor::visit_module(::HIR::Module& mod)
+void ::HIR::Visitor::visit_module(::HIR::PathChain p, ::HIR::Module& mod)
{
TRACE_FUNCTION;
for( auto& named : mod.m_mod_items )
@@ -35,23 +35,23 @@ void ::HIR::Visitor::visit_module(::HIR::Module& mod)
(Import, ),
(Module,
DEBUG("mod " << name);
- this->visit_module(e);
+ this->visit_module(p + name, e);
),
(TypeAlias,
DEBUG("type " << name);
- this->visit_type_alias(e);
+ this->visit_type_alias(p + name, e);
),
(Enum,
DEBUG("enum " << name);
- this->visit_enum(e);
+ this->visit_enum(p + name, e);
),
(Struct,
DEBUG("struct " << name);
- this->visit_struct(e);
+ this->visit_struct(p + name, e);
),
(Trait,
DEBUG("trait " << name);
- this->visit_trait(e);
+ this->visit_trait(p + name, e);
)
)
}
@@ -65,18 +65,18 @@ void ::HIR::Visitor::visit_module(::HIR::Module& mod)
),
(Constant,
DEBUG("const " << name);
- this->visit_constant(e);
+ this->visit_constant(p + name, e);
),
(Static,
DEBUG("static " << name);
- this->visit_static(e);
+ this->visit_static(p + name, e);
),
(StructConstant,
// Just a path
),
(Function,
DEBUG("fn " << name);
- this->visit_function(e);
+ this->visit_function(p + name, e);
),
(StructConstructor,
// Just a path
@@ -88,17 +88,19 @@ void ::HIR::Visitor::visit_module(::HIR::Module& mod)
void ::HIR::Visitor::visit_type_impl(::HIR::TypeImpl& impl)
{
+ ::HIR::PathChain p { "#impl" };
TRACE_FUNCTION_F("impl.m_type=" << impl.m_type);
this->visit_params(impl.m_params);
this->visit_type(impl.m_type);
for(auto& method : impl.m_methods) {
DEBUG("method " << method.first);
- this->visit_function(method.second);
+ this->visit_function(p + method.first, method.second);
}
}
void ::HIR::Visitor::visit_trait_impl(const ::HIR::SimplePath& trait_path, ::HIR::TraitImpl& impl)
{
+ ::HIR::PathChain p { "#impl" };
TRACE_FUNCTION_F("trait_path=" << trait_path);
this->visit_params(impl.m_params);
this->visit_path_params(impl.m_trait_args);
@@ -106,7 +108,7 @@ void ::HIR::Visitor::visit_trait_impl(const ::HIR::SimplePath& trait_path, ::HIR
for(auto& ent : impl.m_methods) {
DEBUG("method " << ent.first);
- this->visit_function(ent.second);
+ this->visit_function(p + ent.first, ent.second);
}
for(auto& ent : impl.m_constants) {
DEBUG("const " << ent.first);
@@ -124,12 +126,12 @@ void ::HIR::Visitor::visit_marker_impl(const ::HIR::SimplePath& trait_path, ::HI
this->visit_type(impl.m_type);
}
-void ::HIR::Visitor::visit_type_alias(::HIR::TypeAlias& item)
+void ::HIR::Visitor::visit_type_alias(::HIR::PathChain p, ::HIR::TypeAlias& item)
{
this->visit_params(item.m_params);
this->visit_type(item.m_type);
}
-void ::HIR::Visitor::visit_trait(::HIR::Trait& item)
+void ::HIR::Visitor::visit_trait(::HIR::PathChain p, ::HIR::Trait& item)
{
TRACE_FUNCTION;
this->visit_params(item.m_params);
@@ -146,20 +148,20 @@ void ::HIR::Visitor::visit_trait(::HIR::Trait& item)
(None, ),
(Constant,
DEBUG("constant " << i.first);
- this->visit_constant(e);
+ this->visit_constant(p + i.first, e);
),
(Static,
DEBUG("static " << i.first);
- this->visit_static(e);
+ this->visit_static(p + i.first, e);
),
(Function,
DEBUG("method " << i.first);
- this->visit_function(e);
+ this->visit_function(p + i.first, e);
)
)
}
}
-void ::HIR::Visitor::visit_struct(::HIR::Struct& item)
+void ::HIR::Visitor::visit_struct(::HIR::PathChain p, ::HIR::Struct& item)
{
this->visit_params(item.m_params);
TU_MATCH(::HIR::Struct::Data, (item.m_data), (e),
@@ -177,7 +179,7 @@ void ::HIR::Visitor::visit_struct(::HIR::Struct& item)
)
)
}
-void ::HIR::Visitor::visit_enum(::HIR::Enum& item)
+void ::HIR::Visitor::visit_enum(::HIR::PathChain p, ::HIR::Enum& item)
{
this->visit_params(item.m_params);
for(auto& var : item.m_variants)
@@ -201,7 +203,7 @@ void ::HIR::Visitor::visit_enum(::HIR::Enum& item)
)
}
}
-void ::HIR::Visitor::visit_function(::HIR::Function& item)
+void ::HIR::Visitor::visit_function(::HIR::PathChain p, ::HIR::Function& item)
{
this->visit_params(item.m_params);
for(auto& arg : item.m_args)
@@ -212,12 +214,12 @@ void ::HIR::Visitor::visit_function(::HIR::Function& item)
this->visit_type(item.m_return);
this->visit_expr(item.m_code);
}
-void ::HIR::Visitor::visit_static(::HIR::Static& item)
+void ::HIR::Visitor::visit_static(::HIR::PathChain p, ::HIR::Static& item)
{
this->visit_type(item.m_type);
this->visit_expr(item.m_value);
}
-void ::HIR::Visitor::visit_constant(::HIR::Constant& item)
+void ::HIR::Visitor::visit_constant(::HIR::PathChain p, ::HIR::Constant& item)
{
this->visit_params(item.m_params);
this->visit_type(item.m_type);