summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/trans/enumerate.cpp32
1 files changed, 31 insertions, 1 deletions
diff --git a/src/trans/enumerate.cpp b/src/trans/enumerate.cpp
index 589c8313..e0f2609c 100644
--- a/src/trans/enumerate.cpp
+++ b/src/trans/enumerate.cpp
@@ -130,10 +130,13 @@ TransList Trans_Enumerate_Public(const ::HIR::Crate& crate)
Trans_Enumerate_Public_Mod(state, crate.m_root_module, ::HIR::SimplePath("",{}));
// Impl blocks
+ StaticTraitResolve resolve { crate };
for(const auto& impl : crate.m_trait_impls)
{
if( impl.second.m_params.m_types.size() > 0 )
continue ;
+ const auto& impl_ty = impl.second.m_type;
+ auto cb_monomorph = monomorphise_type_get_cb(sp, &impl_ty, &impl.second.m_trait_args, nullptr);
// Emit each method/static (in the trait itself)
const auto& trait = crate.get_trait_by_path(sp, impl.first);
@@ -147,7 +150,34 @@ TransList Trans_Enumerate_Public(const ::HIR::Crate& crate)
;
else
{
- auto p = ::HIR::Path(impl.second.m_type.clone(), ::HIR::GenericPath(impl.first, impl.second.m_trait_args.clone()), vi.first);
+ // TODO: Check Self bounds before queueing for codegen
+ if( vi.second.is_Function() )
+ {
+ bool rv = true;
+ for(const auto& b : vi.second.as_Function().m_params.m_bounds)
+ {
+ if( !b.is_TraitBound() ) continue;
+ const auto& be = b.as_TraitBound();
+
+ auto b_ty_mono = monomorphise_type_with(sp, be.type, cb_monomorph); resolve.expand_associated_types(sp, b_ty_mono);
+ auto b_tp_mono = monomorphise_traitpath_with(sp, be.trait, cb_monomorph, false);
+ for(auto& ty : b_tp_mono.m_path.m_params.m_types) {
+ resolve.expand_associated_types(sp, ty);
+ }
+ for(auto& assoc_bound : b_tp_mono.m_type_bounds) {
+ resolve.expand_associated_types(sp, assoc_bound.second);
+ }
+
+ rv = resolve.find_impl(sp, b_tp_mono.m_path.m_path, b_tp_mono.m_path.m_params, b_ty_mono, [&](const auto& impl, bool) {
+ return true;
+ });
+ if( !rv )
+ break;
+ }
+ if( !rv )
+ continue ;
+ }
+ auto p = ::HIR::Path(impl_ty.clone(), ::HIR::GenericPath(impl.first, impl.second.m_trait_args.clone()), vi.first);
Trans_Enumerate_FillFrom_Path(state, p, {});
}
}