Skip to content

Commit cace49e

Browse files
committed
Decouple
1 parent d770f22 commit cace49e

File tree

5 files changed

+42
-45
lines changed

5 files changed

+42
-45
lines changed

crates/ra_hir/src/code_model.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -945,7 +945,7 @@ impl ImplBlock {
945945
}
946946
pub fn for_trait(db: &impl HirDatabase, krate: Crate, trait_: Trait) -> Vec<ImplBlock> {
947947
let impls = db.impls_in_crate(krate.crate_id);
948-
impls.lookup_impl_blocks_for_trait(trait_).map(Self::from).collect()
948+
impls.lookup_impl_blocks_for_trait(trait_.id).map(Self::from).collect()
949949
}
950950

951951
pub fn target_trait(&self, db: &impl DefDatabase) -> Option<TypeRef> {

crates/ra_hir/src/db.rs

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

5+
use hir_def::{GenericDefId, LocalStructFieldId, TraitId, VariantId};
56
use ra_arena::map::ArenaMap;
67
use ra_db::{salsa, CrateId};
78

@@ -12,19 +13,15 @@ use crate::{
1213
CallableDef, FnSig, GenericPredicate, InferenceResult, Substs, Ty, TyDefId, TypeCtor,
1314
ValueTyDefId,
1415
},
15-
Crate, DefWithBody, ImplBlock, Trait,
16+
Crate, DefWithBody, ImplBlock,
1617
};
1718

18-
pub use hir_def::{
19-
db::{
20-
BodyQuery, BodyWithSourceMapQuery, ConstDataQuery, CrateDefMapQuery, CrateLangItemsQuery,
21-
DefDatabase, DefDatabaseStorage, DocumentationQuery, EnumDataQuery, ExprScopesQuery,
22-
FunctionDataQuery, GenericParamsQuery, ImplDataQuery, InternDatabase,
23-
InternDatabaseStorage, LangItemQuery, ModuleLangItemsQuery, RawItemsQuery,
24-
RawItemsWithSourceMapQuery, StaticDataQuery, StructDataQuery, TraitDataQuery,
25-
TypeAliasDataQuery,
26-
},
27-
GenericDefId, LocalStructFieldId, VariantId,
19+
pub use hir_def::db::{
20+
BodyQuery, BodyWithSourceMapQuery, ConstDataQuery, CrateDefMapQuery, CrateLangItemsQuery,
21+
DefDatabase, DefDatabaseStorage, DocumentationQuery, EnumDataQuery, ExprScopesQuery,
22+
FunctionDataQuery, GenericParamsQuery, ImplDataQuery, InternDatabase, InternDatabaseStorage,
23+
LangItemQuery, ModuleLangItemsQuery, RawItemsQuery, RawItemsWithSourceMapQuery,
24+
StaticDataQuery, StructDataQuery, TraitDataQuery, TypeAliasDataQuery,
2825
};
2926
pub use hir_expand::db::{
3027
AstDatabase, AstDatabaseStorage, AstIdMapQuery, MacroArgQuery, MacroDefQuery, MacroExpandQuery,
@@ -66,7 +63,7 @@ pub trait HirDatabase: DefDatabase {
6663
fn impls_in_crate(&self, krate: CrateId) -> Arc<CrateImplBlocks>;
6764

6865
#[salsa::invoke(crate::ty::traits::impls_for_trait_query)]
69-
fn impls_for_trait(&self, krate: Crate, trait_: Trait) -> Arc<[ImplBlock]>;
66+
fn impls_for_trait(&self, krate: CrateId, trait_: TraitId) -> Arc<[ImplBlock]>;
7067

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

crates/ra_hir/src/ty/method_resolution.rs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ use std::sync::Arc;
66

77
use arrayvec::ArrayVec;
88
use hir_def::{
9-
lang_item::LangItemTarget, resolver::HasResolver, resolver::Resolver, AssocItemId, AstItemDef,
10-
HasModule, ImplId, TraitId,
9+
lang_item::LangItemTarget, resolver::HasResolver, resolver::Resolver, type_ref::Mutability,
10+
AssocItemId, AstItemDef, HasModule, ImplId, TraitId,
1111
};
12+
use hir_expand::name::Name;
1213
use ra_db::CrateId;
1314
use ra_prof::profile;
1415
use rustc_hash::FxHashMap;
@@ -17,7 +18,7 @@ use crate::{
1718
db::HirDatabase,
1819
ty::primitive::{FloatBitness, Uncertain},
1920
ty::{utils::all_super_traits, Ty, TypeCtor},
20-
AssocItem, Crate, Function, Mutability, Name, Trait,
21+
AssocItem, Function,
2122
};
2223

2324
use super::{autoderef, Canonical, InEnvironment, TraitEnvironment, TraitRef};
@@ -87,23 +88,27 @@ impl CrateImplBlocks {
8788
fingerprint.and_then(|f| self.impls.get(&f)).into_iter().flatten().copied()
8889
}
8990

90-
pub fn lookup_impl_blocks_for_trait(&self, tr: Trait) -> impl Iterator<Item = ImplId> + '_ {
91-
self.impls_by_trait.get(&tr.id).into_iter().flatten().copied()
91+
pub fn lookup_impl_blocks_for_trait(&self, tr: TraitId) -> impl Iterator<Item = ImplId> + '_ {
92+
self.impls_by_trait.get(&tr).into_iter().flatten().copied()
9293
}
9394

9495
pub fn all_impls<'a>(&'a self) -> impl Iterator<Item = ImplId> + 'a {
9596
self.impls.values().chain(self.impls_by_trait.values()).flatten().copied()
9697
}
9798
}
9899

99-
fn def_crates(db: &impl HirDatabase, cur_crate: Crate, ty: &Ty) -> Option<ArrayVec<[Crate; 2]>> {
100+
fn def_crates(
101+
db: &impl HirDatabase,
102+
cur_crate: CrateId,
103+
ty: &Ty,
104+
) -> Option<ArrayVec<[CrateId; 2]>> {
100105
// Types like slice can have inherent impls in several crates, (core and alloc).
101106
// The corresponding impls are marked with lang items, so we can use them to find the required crates.
102107
macro_rules! lang_item_crate {
103108
($($name:expr),+ $(,)?) => {{
104109
let mut v = ArrayVec::<[LangItemTarget; 2]>::new();
105110
$(
106-
v.extend(db.lang_item(cur_crate.crate_id, $name.into()));
111+
v.extend(db.lang_item(cur_crate, $name.into()));
107112
)+
108113
v
109114
}};
@@ -112,7 +117,7 @@ fn def_crates(db: &impl HirDatabase, cur_crate: Crate, ty: &Ty) -> Option<ArrayV
112117
let lang_item_targets = match ty {
113118
Ty::Apply(a_ty) => match a_ty.ctor {
114119
TypeCtor::Adt(def_id) => {
115-
return Some(std::iter::once(def_id.module(db).krate.into()).collect())
120+
return Some(std::iter::once(def_id.module(db).krate).collect())
116121
}
117122
TypeCtor::Bool => lang_item_crate!("bool"),
118123
TypeCtor::Char => lang_item_crate!("char"),
@@ -136,7 +141,7 @@ fn def_crates(db: &impl HirDatabase, cur_crate: Crate, ty: &Ty) -> Option<ArrayV
136141
LangItemTarget::ImplBlockId(it) => Some(it),
137142
_ => None,
138143
})
139-
.map(|it| it.module(db).krate.into())
144+
.map(|it| it.module(db).krate)
140145
.collect();
141146
Some(res)
142147
}
@@ -193,14 +198,9 @@ pub(crate) fn iterate_method_candidates<T>(
193198
let environment = TraitEnvironment::lower(db, resolver);
194199
let ty = InEnvironment { value: ty.clone(), environment };
195200
for derefed_ty in autoderef::autoderef(db, resolver.krate(), ty) {
196-
if let Some(result) = iterate_inherent_methods(
197-
&derefed_ty,
198-
db,
199-
name,
200-
mode,
201-
krate.into(),
202-
&mut callback,
203-
) {
201+
if let Some(result) =
202+
iterate_inherent_methods(&derefed_ty, db, name, mode, krate, &mut callback)
203+
{
204204
return Some(result);
205205
}
206206
if let Some(result) = iterate_trait_method_candidates(
@@ -283,11 +283,11 @@ fn iterate_inherent_methods<T>(
283283
db: &impl HirDatabase,
284284
name: Option<&Name>,
285285
mode: LookupMode,
286-
krate: Crate,
286+
krate: CrateId,
287287
mut callback: impl FnMut(&Ty, AssocItem) -> Option<T>,
288288
) -> Option<T> {
289289
for krate in def_crates(db, krate, &ty.value)? {
290-
let impls = db.impls_in_crate(krate.crate_id);
290+
let impls = db.impls_in_crate(krate);
291291

292292
for impl_block in impls.lookup_impl_blocks(&ty.value) {
293293
for &item in db.impl_data(impl_block).items.iter() {
@@ -327,7 +327,7 @@ pub(crate) fn implements_trait(
327327
ty: &Canonical<Ty>,
328328
db: &impl HirDatabase,
329329
resolver: &Resolver,
330-
krate: Crate,
330+
krate: CrateId,
331331
trait_: TraitId,
332332
) -> bool {
333333
if ty.value.inherent_trait() == Some(trait_) {
@@ -337,7 +337,7 @@ pub(crate) fn implements_trait(
337337
}
338338
let env = TraitEnvironment::lower(db, resolver);
339339
let goal = generic_implements_goal(db, env, trait_, ty.clone());
340-
let solution = db.trait_solve(krate, goal);
340+
let solution = db.trait_solve(krate.into(), goal);
341341

342342
solution.is_some()
343343
}
@@ -348,11 +348,11 @@ impl Ty {
348348
pub fn iterate_impl_items<T>(
349349
self,
350350
db: &impl HirDatabase,
351-
krate: Crate,
351+
krate: CrateId,
352352
mut callback: impl FnMut(AssocItem) -> Option<T>,
353353
) -> Option<T> {
354354
for krate in def_crates(db, krate, &self)? {
355-
let impls = db.impls_in_crate(krate.crate_id);
355+
let impls = db.impls_in_crate(krate);
356356

357357
for impl_block in impls.lookup_impl_blocks(&self) {
358358
for &item in db.impl_data(impl_block).items.iter() {

crates/ra_hir/src/ty/traits.rs

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

44
use chalk_ir::{cast::Cast, family::ChalkIr};
5-
use hir_def::{expr::ExprId, DefWithBodyId};
5+
use hir_def::{expr::ExprId, DefWithBodyId, TraitId};
66
use log::debug;
7-
use ra_db::{impl_intern_key, salsa};
7+
use ra_db::{impl_intern_key, salsa, CrateId};
88
use ra_prof::profile;
99
use rustc_hash::FxHashSet;
1010

11-
use crate::{db::HirDatabase, Crate, ImplBlock, Trait, TypeAlias};
11+
use crate::{db::HirDatabase, Crate, ImplBlock, TypeAlias};
1212

1313
use super::{Canonical, GenericPredicate, HirDisplay, ProjectionTy, TraitRef, Ty, TypeWalk};
1414

@@ -77,19 +77,19 @@ pub(crate) fn trait_solver_query(
7777
/// Collects impls for the given trait in the whole dependency tree of `krate`.
7878
pub(crate) fn impls_for_trait_query(
7979
db: &impl HirDatabase,
80-
krate: Crate,
81-
trait_: Trait,
80+
krate: CrateId,
81+
trait_: TraitId,
8282
) -> Arc<[ImplBlock]> {
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
8686
// will only ever get called for a few crates near the root of the tree (the
8787
// ones the user is editing), so this may actually be a waste of memory. I'm
8888
// doing it like this mainly for simplicity for now.
89-
for dep in krate.dependencies(db) {
90-
impls.extend(db.impls_for_trait(dep.krate, trait_).iter());
89+
for dep in db.crate_graph().dependencies(krate) {
90+
impls.extend(db.impls_for_trait(dep.crate_id, trait_).iter());
9191
}
92-
let crate_impl_blocks = db.impls_in_crate(krate.crate_id);
92+
let crate_impl_blocks = db.impls_in_crate(krate);
9393
impls.extend(crate_impl_blocks.lookup_impl_blocks_for_trait(trait_).map(ImplBlock::from));
9494
impls.into_iter().collect()
9595
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ where
448448
let trait_: TraitId = from_chalk(self.db, trait_id);
449449
let mut result: Vec<_> = self
450450
.db
451-
.impls_for_trait(self.krate, trait_.into())
451+
.impls_for_trait(self.krate.crate_id, trait_.into())
452452
.iter()
453453
.copied()
454454
.map(Impl::ImplBlock)

0 commit comments

Comments
 (0)