Skip to content

Commit 3a0929f

Browse files
committed
Decouple
1 parent a306531 commit 3a0929f

File tree

4 files changed

+24
-11
lines changed

4 files changed

+24
-11
lines changed

crates/ra_hir/src/db.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
use std::sync::Arc;
44

5-
use hir_def::{GenericDefId, LocalStructFieldId, TraitId, VariantId};
5+
use hir_def::{GenericDefId, ImplId, LocalStructFieldId, TraitId, VariantId};
66
use ra_arena::map::ArenaMap;
77
use ra_db::{salsa, CrateId};
88

@@ -13,7 +13,7 @@ use crate::{
1313
CallableDef, FnSig, GenericPredicate, InferenceResult, Substs, Ty, TyDefId, TypeCtor,
1414
ValueTyDefId,
1515
},
16-
DefWithBody, ImplBlock,
16+
DefWithBody,
1717
};
1818

1919
pub use hir_def::db::{
@@ -63,7 +63,7 @@ pub trait HirDatabase: DefDatabase {
6363
fn impls_in_crate(&self, krate: CrateId) -> Arc<CrateImplBlocks>;
6464

6565
#[salsa::invoke(crate::ty::traits::impls_for_trait_query)]
66-
fn impls_for_trait(&self, krate: CrateId, trait_: TraitId) -> Arc<[ImplBlock]>;
66+
fn impls_for_trait(&self, krate: CrateId, trait_: TraitId) -> Arc<[ImplId]>;
6767

6868
/// This provides the Chalk trait solver instance. Because Chalk always
6969
/// works from a specific crate, this query is keyed on the crate; and

crates/ra_hir/src/ty/infer/coerce.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44
//!
55
//! See: https://doc.rust-lang.org/nomicon/coercions.html
66
7-
use hir_def::{lang_item::LangItemTarget, resolver::Resolver, AdtId};
7+
use hir_def::{
8+
lang_item::LangItemTarget,
9+
resolver::{HasResolver, Resolver},
10+
AdtId,
11+
};
812
use rustc_hash::FxHashMap;
913
use test_utils::tested_by;
1014

1115
use crate::{
1216
db::HirDatabase,
13-
ty::{autoderef, Substs, Ty, TypeCtor, TypeWalk},
17+
ty::{autoderef, Substs, TraitRef, Ty, TypeCtor, TypeWalk},
1418
Mutability,
1519
};
1620

@@ -57,9 +61,18 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
5761

5862
impls
5963
.iter()
60-
.filter_map(|impl_block| {
64+
.filter_map(|&impl_id| {
65+
let impl_data = db.impl_data(impl_id);
66+
let resolver = impl_id.resolver(db);
67+
let target_ty = Ty::from_hir(db, &resolver, &impl_data.target_type);
68+
6169
// `CoerseUnsized` has one generic parameter for the target type.
62-
let trait_ref = impl_block.target_trait_ref(db)?;
70+
let trait_ref = TraitRef::from_hir(
71+
db,
72+
&resolver,
73+
impl_data.target_trait.as_ref()?,
74+
Some(target_ty),
75+
)?;
6376
let cur_from_ty = trait_ref.substs.0.get(0)?;
6477
let cur_to_ty = trait_ref.substs.0.get(1)?;
6578

crates/ra_hir/src/ty/traits.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
use std::sync::{Arc, Mutex};
33

44
use chalk_ir::{cast::Cast, family::ChalkIr};
5-
use hir_def::{expr::ExprId, DefWithBodyId, TraitId, TypeAliasId};
5+
use hir_def::{expr::ExprId, DefWithBodyId, ImplId, TraitId, TypeAliasId};
66
use log::debug;
77
use ra_db::{impl_intern_key, salsa, CrateId};
88
use ra_prof::profile;
@@ -79,7 +79,7 @@ pub(crate) fn impls_for_trait_query(
7979
db: &impl HirDatabase,
8080
krate: CrateId,
8181
trait_: TraitId,
82-
) -> Arc<[ImplBlock]> {
82+
) -> Arc<[ImplId]> {
8383
let mut impls = FxHashSet::default();
8484
// We call the query recursively here. On the one hand, this means we can
8585
// reuse results from queries for different crates; on the other hand, this
@@ -90,7 +90,7 @@ pub(crate) fn impls_for_trait_query(
9090
impls.extend(db.impls_for_trait(dep.crate_id, trait_).iter());
9191
}
9292
let crate_impl_blocks = db.impls_in_crate(krate);
93-
impls.extend(crate_impl_blocks.lookup_impl_blocks_for_trait(trait_).map(ImplBlock::from));
93+
impls.extend(crate_impl_blocks.lookup_impl_blocks_for_trait(trait_));
9494
impls.into_iter().collect()
9595
}
9696

crates/ra_hir/src/ty/traits/chalk.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ where
453453
.impls_for_trait(self.krate, trait_.into())
454454
.iter()
455455
.copied()
456-
.map(Impl::ImplBlock)
456+
.map(|it| Impl::ImplBlock(it.into()))
457457
.map(|impl_| impl_.to_chalk(self.db))
458458
.collect();
459459

0 commit comments

Comments
 (0)