summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/hir/from_ast.cpp1
-rw-r--r--src/hir_conv/expand_type.cpp1
-rw-r--r--src/hir_typeck/expr_cs.cpp16
-rw-r--r--src/hir_typeck/helpers.cpp5
4 files changed, 22 insertions, 1 deletions
diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp
index 48aa7af4..b005f79b 100644
--- a/src/hir/from_ast.cpp
+++ b/src/hir/from_ast.cpp
@@ -1181,6 +1181,7 @@ void _add_mod_val_item(::HIR::Module& mod, ::std::string name, bool is_pub, ::H
{
const auto& sp = item.data.span;
auto item_path = ::HIR::ItemPath(path, item.name.c_str());
+ DEBUG(item_path << " " << item.data.tag_str());
TU_MATCH(::AST::Item, (item.data), (e),
(None,
),
diff --git a/src/hir_conv/expand_type.cpp b/src/hir_conv/expand_type.cpp
index 44102f18..6802cf22 100644
--- a/src/hir_conv/expand_type.cpp
+++ b/src/hir_conv/expand_type.cpp
@@ -231,6 +231,7 @@ public:
void visit(::HIR::ExprNode_CallPath& node) override
{
+ //TRACE_FUNCTION_F(node.m_path);
upper_visitor.visit_path(node.m_path, ::HIR::Visitor::PathContext::VALUE);
::HIR::ExprVisitorDef::visit(node);
}
diff --git a/src/hir_typeck/expr_cs.cpp b/src/hir_typeck/expr_cs.cpp
index 61f2b568..226be96c 100644
--- a/src/hir_typeck/expr_cs.cpp
+++ b/src/hir_typeck/expr_cs.cpp
@@ -2606,7 +2606,12 @@ namespace {
// Using autoderef, locate this method on the type
::HIR::Path fcn_path { ::HIR::SimplePath() };
TraitResolution::AutoderefBorrow ad_borrow;
+ // TODO: Obtain a list of avaliable methods at that level?
+ // - If running in a mode after stablise (before defaults), fall
+ // back to trait if the inherent is still ambigious.
unsigned int deref_count = this->context.m_resolve.autoderef_find_method(node.span(), node.m_traits, node.m_trait_param_ivars, ty, node.m_method, fcn_path, ad_borrow);
+ //::std::vector<::std::pair<TraitResolution::AutoderefBorrow, ::HIR::Path>> possible_methods;
+ //unsigned int deref_count = this->context.m_resolve.autoderef_find_method(node.span(), node.m_traits, node.m_trait_param_ivars, ty, node.m_method, possible_methods);
if( deref_count != ~0u )
{
DEBUG("- deref_count = " << deref_count << ", fcn_path = " << fcn_path);
@@ -2629,6 +2634,17 @@ namespace {
)
if( !visit_call_populate_cache(this->context, node.span(), node.m_method_path, node.m_cache) ) {
DEBUG("- AMBIGUOUS - Trying again later");
+ // Move the params back
+ TU_MATCH(::HIR::Path::Data, (node.m_method_path.m_data), (e),
+ (Generic, ),
+ (UfcsUnknown, ),
+ (UfcsKnown,
+ node.m_params = mv$(e.params);
+ ),
+ (UfcsInherent,
+ node.m_params = mv$(e.params);
+ )
+ )
return ;
}
DEBUG("> m_method_path = " << node.m_method_path);
diff --git a/src/hir_typeck/helpers.cpp b/src/hir_typeck/helpers.cpp
index eb8fef0a..94f7304d 100644
--- a/src/hir_typeck/helpers.cpp
+++ b/src/hir_typeck/helpers.cpp
@@ -3465,6 +3465,8 @@ const ::HIR::TypeRef* TraitResolution::autoderef(const Span& sp, const ::HIR::Ty
}
}
}
+
+//unsigned int TraitResolution::autoderef_find_method(const Span& sp, const HIR::t_trait_list& traits, const ::std::vector<unsigned>& ivars, const ::HIR::TypeRef& top_ty, const ::std::string& method_name, /* Out -> */::std::vector<AutoderefBorrow,::HIR::Path>& possibilities) const
unsigned int TraitResolution::autoderef_find_method(const Span& sp, const HIR::t_trait_list& traits, const ::std::vector<unsigned>& ivars, const ::HIR::TypeRef& top_ty, const ::std::string& method_name, /* Out -> */::HIR::Path& fcn_path, AutoderefBorrow& borrow) const
{
TRACE_FUNCTION_F("{" << top_ty << "}." << method_name);
@@ -3501,7 +3503,7 @@ unsigned int TraitResolution::autoderef_find_method(const Span& sp, const HIR::t
if( ty.m_data.is_Borrow() && should_pause( this->m_ivars.get_type(*ty.m_data.as_Borrow().inner) ) ) {
return ~0u;
}
- // TODO: Pause on Box<_>
+ // TODO: Pause on Box<_>?
DEBUG(deref_count << ": " << ty);
// Non-referenced
@@ -3898,6 +3900,7 @@ bool TraitResolution::find_method(
}
// 4. Search for inherent methods
+ // - Inherent methods are searched first.
DEBUG("> Inherent methods");
{
const ::HIR::TypeRef* cur_check_ty = &ty;