Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/next_solver/solver.rs')
| -rw-r--r-- | crates/hir-ty/src/next_solver/solver.rs | 65 |
1 files changed, 45 insertions, 20 deletions
diff --git a/crates/hir-ty/src/next_solver/solver.rs b/crates/hir-ty/src/next_solver/solver.rs index a161423da4..2457447ee3 100644 --- a/crates/hir-ty/src/next_solver/solver.rs +++ b/crates/hir-ty/src/next_solver/solver.rs @@ -149,13 +149,9 @@ impl<'db> SolverDelegate for SolverContext<'db> { fn fetch_eligible_assoc_item( &self, goal_trait_ref: rustc_type_ir::TraitRef<Self::Interner>, - trait_assoc_def_id: <Self::Interner as rustc_type_ir::Interner>::DefId, + trait_assoc_def_id: SolverDefId, impl_id: ImplIdWrapper, - ) -> Result<Option<<Self::Interner as rustc_type_ir::Interner>::DefId>, ErrorGuaranteed> { - let trait_assoc_id = match trait_assoc_def_id { - SolverDefId::TypeAliasId(id) => id, - _ => panic!("Unexpected SolverDefId"), - }; + ) -> Result<Option<SolverDefId>, ErrorGuaranteed> { let trait_ = self .0 .interner @@ -167,18 +163,47 @@ impl<'db> SolverDelegate for SolverContext<'db> { .def_id .0; let trait_data = trait_.trait_items(self.0.interner.db()); - let id = - impl_id.0.impl_items(self.0.interner.db()).items.iter().find_map(|item| -> Option<_> { - match item { - (_, AssocItemId::TypeAliasId(type_alias)) => { - let name = &self.0.interner.db().type_alias_signature(*type_alias).name; - let found_trait_assoc_id = trait_data.associated_type_by_name(name)?; - (found_trait_assoc_id == trait_assoc_id).then_some(*type_alias) - } - _ => None, - } - }); - Ok(id.map(SolverDefId::TypeAliasId)) + let impl_items = impl_id.0.impl_items(self.0.interner.db()); + let id = match trait_assoc_def_id { + SolverDefId::TypeAliasId(trait_assoc_id) => { + let trait_assoc_data = self.0.interner.db.type_alias_signature(trait_assoc_id); + impl_items + .items + .iter() + .find_map(|(impl_assoc_name, impl_assoc_id)| { + if let AssocItemId::TypeAliasId(impl_assoc_id) = *impl_assoc_id + && *impl_assoc_name == trait_assoc_data.name + { + Some(impl_assoc_id) + } else { + None + } + }) + .map(SolverDefId::TypeAliasId) + } + SolverDefId::ConstId(trait_assoc_id) => { + let trait_assoc_data = self.0.interner.db.const_signature(trait_assoc_id); + let trait_assoc_name = trait_assoc_data + .name + .as_ref() + .expect("unnamed consts should not get passed to the solver"); + impl_items + .items + .iter() + .find_map(|(impl_assoc_name, impl_assoc_id)| { + if let AssocItemId::ConstId(impl_assoc_id) = *impl_assoc_id + && impl_assoc_name == trait_assoc_name + { + Some(impl_assoc_id) + } else { + None + } + }) + .map(SolverDefId::ConstId) + } + _ => panic!("Unexpected SolverDefId"), + }; + Ok(id) } fn is_transmutable( @@ -200,9 +225,9 @@ impl<'db> SolverDelegate for SolverContext<'db> { SolverDefId::StaticId(c) => GeneralConstId::StaticId(c), _ => unreachable!(), }; - let subst = uv.args.to_chalk(self.interner); + let subst = uv.args; let ec = self.cx().db.const_eval(c, subst, None).ok()?; - Some(ec.to_nextsolver(self.interner)) + Some(ec) } fn compute_goal_fast_path( |