diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/hir/from_ast.cpp | 1 | ||||
-rw-r--r-- | src/hir_conv/expand_type.cpp | 1 | ||||
-rw-r--r-- | src/hir_typeck/expr_cs.cpp | 16 | ||||
-rw-r--r-- | src/hir_typeck/helpers.cpp | 5 |
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; |