#include "rust-compile-implitem.h"
#include "rust-hir-type-bounds.h"
#include "rust-compile-type.h"
+#include "rust-substitution-mapper.h"
+#include "rust-type-util.h"
namespace Rust {
namespace Compile {
= self_bound->lookup_associated_item (ref->get_identifier ());
rust_assert (!associated_self_item.is_error ());
- TyTy::BaseType *mono1 = associated_self_item.get_tyty_for_receiver (self);
- rust_assert (mono1 != nullptr);
- rust_assert (mono1->get_kind () == TyTy::TypeKind::FNDEF);
- TyTy::FnType *assocated_item_ty1 = static_cast<TyTy::FnType *> (mono1);
-
// Lookup the impl-block for the associated impl_item if it exists
HIR::Function *associated_function = nullptr;
for (auto &impl_item : associated_impl_block->get_impl_items ())
if (lookup_fntype->needs_substitution ())
{
- TyTy::SubstitutionArgumentMappings mappings
- = assocated_item_ty1->solve_missing_mappings_from_this (
- *trait_item_fntype, *lookup_fntype);
- lookup_fntype = lookup_fntype->handle_substitions (mappings);
+ TyTy::BaseType *infer
+ = Resolver::SubstMapper::InferSubst (lookup_fntype, Location ());
+ infer
+ = Resolver::unify_site (infer->get_ref (),
+ TyTy::TyWithLocation (trait_item_fntype),
+ TyTy::TyWithLocation (infer), Location ());
+ rust_assert (infer->get_kind () == TyTy::TypeKind::FNDEF);
+ lookup_fntype = static_cast<TyTy::FnType *> (infer);
}
return CompileInherentImplItem::Compile (associated_function, ctx,
mappings.get_locus ());
}
-SubstitutionArgumentMappings
-SubstitutionRef::solve_missing_mappings_from_this (SubstitutionRef &ref,
- SubstitutionRef &to)
-{
- rust_assert (!ref.needs_substitution ());
- rust_assert (needs_substitution ());
- rust_assert (get_num_substitutions () == ref.get_num_substitutions ());
-
- Location locus = used_arguments.get_locus ();
- std::vector<SubstitutionArg> resolved_mappings;
-
- std::map<HirId, std::pair<ParamType *, BaseType *>> substs;
- for (size_t i = 0; i < get_num_substitutions (); i++)
- {
- SubstitutionParamMapping &a = substitutions.at (i);
- SubstitutionParamMapping &b = ref.substitutions.at (i);
-
- if (a.need_substitution ())
- {
- const BaseType *root = a.get_param_ty ()->resolve ()->get_root ();
- rust_assert (root->get_kind () == TyTy::TypeKind::PARAM);
- const ParamType *p = static_cast<const TyTy::ParamType *> (root);
-
- substs[p->get_ty_ref ()] = {static_cast<ParamType *> (p->clone ()),
- b.get_param_ty ()->resolve ()};
- }
- }
-
- for (auto it = substs.begin (); it != substs.end (); it++)
- {
- HirId param_id = it->first;
- BaseType *arg = it->second.second;
-
- const SubstitutionParamMapping *associate_param = nullptr;
- for (SubstitutionParamMapping &p : to.substitutions)
- {
- if (p.get_param_ty ()->get_ty_ref () == param_id)
- {
- associate_param = &p;
- break;
- }
- }
-
- rust_assert (associate_param != nullptr);
- SubstitutionArg argument (associate_param, arg);
- resolved_mappings.push_back (std::move (argument));
- }
-
- return SubstitutionArgumentMappings (resolved_mappings, {}, locus);
-}
-
Resolver::AssociatedImplTrait *
SubstitutionRef::lookup_associated_impl (const SubstitutionParamMapping &subst,
const TypeBoundPredicate &bound,
SubstitutionArgumentMappings solve_mappings_from_receiver_for_self (
SubstitutionArgumentMappings &mappings) const;
- // TODO comment
- SubstitutionArgumentMappings
- solve_missing_mappings_from_this (SubstitutionRef &ref, SubstitutionRef &to);
-
- // TODO comment
+ // Given a type such as:
+ //
+ // fn<X,Y>(a:&X, b:Y) -> (...)
+ //
+ // This function will inject implicit inference variables for the type
+ // parameters X and Y
BaseType *infer_substitions (Location locus);
// this clears any possible projections from higher ranked trait bounds which