Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit c4b3075

Browse files
committed
Don't allocate inherent_impls_in_block and trait_impls_in_block if its empty
1 parent 4e16e0f commit c4b3075

File tree

3 files changed

+56
-35
lines changed

3 files changed

+56
-35
lines changed

crates/hir-ty/src/chalk_db.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ impl chalk_solve::RustIrDatabase<Interner> for ChalkContext<'_> {
167167
}
168168
});
169169
})
170-
.map(|block_id| self.db.trait_impls_in_block(block_id));
170+
.filter_map(|block_id| self.db.trait_impls_in_block(block_id));
171171

172172
let id_to_chalk = |id: hir_def::ImplId| id.to_chalk(self.db);
173173
let mut result = vec![];
@@ -183,7 +183,8 @@ impl chalk_solve::RustIrDatabase<Interner> for ChalkContext<'_> {
183183
def_blocks
184184
.into_iter()
185185
.flatten()
186-
.for_each(|it| f(&self.db.trait_impls_in_block(it)));
186+
.filter_map(|it| self.db.trait_impls_in_block(it))
187+
.for_each(|it| f(&it));
187188
}
188189
fps => {
189190
let mut f =
@@ -198,7 +199,8 @@ impl chalk_solve::RustIrDatabase<Interner> for ChalkContext<'_> {
198199
def_blocks
199200
.into_iter()
200201
.flatten()
201-
.for_each(|it| f(&self.db.trait_impls_in_block(it)));
202+
.filter_map(|it| self.db.trait_impls_in_block(it))
203+
.for_each(|it| f(&it));
202204
}
203205
}
204206

crates/hir-ty/src/db.rs

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
3434
#[salsa::invoke(crate::infer::infer_query)]
3535
fn infer_query(&self, def: DefWithBodyId) -> Arc<InferenceResult>;
3636

37+
// region:mir
38+
3739
#[salsa::invoke(crate::mir::mir_body_query)]
3840
#[salsa::cycle(crate::mir::mir_body_recover)]
3941
fn mir_body(&self, def: DefWithBodyId) -> Result<Arc<MirBody>, MirLowerError>;
@@ -61,20 +63,6 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
6163
#[salsa::invoke(crate::mir::borrowck_query)]
6264
fn borrowck(&self, def: DefWithBodyId) -> Result<Arc<[BorrowckResult]>, MirLowerError>;
6365

64-
#[salsa::invoke(crate::lower::ty_query)]
65-
#[salsa::cycle(crate::lower::ty_recover)]
66-
fn ty(&self, def: TyDefId) -> Binders<Ty>;
67-
68-
#[salsa::invoke(crate::lower::value_ty_query)]
69-
fn value_ty(&self, def: ValueTyDefId) -> Binders<Ty>;
70-
71-
#[salsa::invoke(crate::lower::impl_self_ty_query)]
72-
#[salsa::cycle(crate::lower::impl_self_ty_recover)]
73-
fn impl_self_ty(&self, def: ImplId) -> Binders<Ty>;
74-
75-
#[salsa::invoke(crate::lower::const_param_ty_query)]
76-
fn const_param_ty(&self, def: ConstParamId) -> Ty;
77-
7866
#[salsa::invoke(crate::consteval::const_eval_query)]
7967
#[salsa::cycle(crate::consteval::const_eval_recover)]
8068
fn const_eval(
@@ -92,6 +80,22 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
9280
#[salsa::cycle(crate::consteval::const_eval_discriminant_recover)]
9381
fn const_eval_discriminant(&self, def: EnumVariantId) -> Result<i128, ConstEvalError>;
9482

83+
// endregion:mir
84+
85+
#[salsa::invoke(crate::lower::ty_query)]
86+
#[salsa::cycle(crate::lower::ty_recover)]
87+
fn ty(&self, def: TyDefId) -> Binders<Ty>;
88+
89+
#[salsa::invoke(crate::lower::value_ty_query)]
90+
fn value_ty(&self, def: ValueTyDefId) -> Binders<Ty>;
91+
92+
#[salsa::invoke(crate::lower::impl_self_ty_query)]
93+
#[salsa::cycle(crate::lower::impl_self_ty_recover)]
94+
fn impl_self_ty(&self, def: ImplId) -> Binders<Ty>;
95+
96+
#[salsa::invoke(crate::lower::const_param_ty_query)]
97+
fn const_param_ty(&self, def: ConstParamId) -> Ty;
98+
9599
#[salsa::invoke(crate::lower::impl_trait_query)]
96100
fn impl_trait(&self, def: ImplId) -> Option<Binders<TraitRef>>;
97101

@@ -158,7 +162,7 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
158162
fn inherent_impls_in_crate(&self, krate: CrateId) -> Arc<InherentImpls>;
159163

160164
#[salsa::invoke(InherentImpls::inherent_impls_in_block_query)]
161-
fn inherent_impls_in_block(&self, block: BlockId) -> Arc<InherentImpls>;
165+
fn inherent_impls_in_block(&self, block: BlockId) -> Option<Arc<InherentImpls>>;
162166

163167
/// Collects all crates in the dependency graph that have impls for the
164168
/// given fingerprint. This is only used for primitive types and types
@@ -175,7 +179,7 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
175179
fn trait_impls_in_crate(&self, krate: CrateId) -> Arc<TraitImpls>;
176180

177181
#[salsa::invoke(TraitImpls::trait_impls_in_block_query)]
178-
fn trait_impls_in_block(&self, block: BlockId) -> Arc<TraitImpls>;
182+
fn trait_impls_in_block(&self, block: BlockId) -> Option<Arc<TraitImpls>>;
179183

180184
#[salsa::invoke(TraitImpls::trait_impls_in_deps_query)]
181185
fn trait_impls_in_deps(&self, krate: CrateId) -> Arc<[Arc<TraitImpls>]>;

crates/hir-ty/src/method_resolution.rs

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,20 @@ impl TraitImpls {
152152
Arc::new(Self::finish(impls))
153153
}
154154

155-
pub(crate) fn trait_impls_in_block_query(db: &dyn HirDatabase, block: BlockId) -> Arc<Self> {
155+
pub(crate) fn trait_impls_in_block_query(
156+
db: &dyn HirDatabase,
157+
block: BlockId,
158+
) -> Option<Arc<Self>> {
156159
let _p = profile::span("trait_impls_in_block_query");
157160
let mut impls = FxHashMap::default();
158161

159162
Self::collect_def_map(db, &mut impls, &db.block_def_map(block));
160163

161-
Arc::new(Self::finish(impls))
164+
if impls.is_empty() {
165+
None
166+
} else {
167+
Some(Arc::new(Self::finish(impls)))
168+
}
162169
}
163170

164171
pub(crate) fn trait_impls_in_deps_query(
@@ -276,15 +283,22 @@ impl InherentImpls {
276283
Arc::new(impls)
277284
}
278285

279-
pub(crate) fn inherent_impls_in_block_query(db: &dyn HirDatabase, block: BlockId) -> Arc<Self> {
286+
pub(crate) fn inherent_impls_in_block_query(
287+
db: &dyn HirDatabase,
288+
block: BlockId,
289+
) -> Option<Arc<Self>> {
280290
let _p = profile::span("inherent_impls_in_block_query");
281291
let mut impls = Self { map: FxHashMap::default(), invalid_impls: Vec::default() };
282292

283293
let block_def_map = db.block_def_map(block);
284294
impls.collect_def_map(db, &block_def_map);
285295
impls.shrink_to_fit();
286296

287-
Arc::new(impls)
297+
if impls.map.is_empty() && impls.invalid_impls.is_empty() {
298+
None
299+
} else {
300+
Some(Arc::new(impls))
301+
}
288302
}
289303

290304
fn shrink_to_fit(&mut self) {
@@ -732,7 +746,7 @@ fn lookup_impl_assoc_item_for_trait_ref(
732746
let impls = db.trait_impls_in_deps(env.krate);
733747
let self_impls = match self_ty.kind(Interner) {
734748
TyKind::Adt(id, _) => {
735-
id.0.module(db.upcast()).containing_block().map(|it| db.trait_impls_in_block(it))
749+
id.0.module(db.upcast()).containing_block().and_then(|it| db.trait_impls_in_block(it))
736750
}
737751
_ => None,
738752
};
@@ -1249,17 +1263,18 @@ fn iterate_inherent_methods(
12491263
};
12501264

12511265
while let Some(block_id) = block {
1252-
let impls = db.inherent_impls_in_block(block_id);
1253-
impls_for_self_ty(
1254-
&impls,
1255-
self_ty,
1256-
table,
1257-
name,
1258-
receiver_ty,
1259-
receiver_adjustments.clone(),
1260-
module,
1261-
callback,
1262-
)?;
1266+
if let Some(impls) = db.inherent_impls_in_block(block_id) {
1267+
impls_for_self_ty(
1268+
&impls,
1269+
self_ty,
1270+
table,
1271+
name,
1272+
receiver_ty,
1273+
receiver_adjustments.clone(),
1274+
module,
1275+
callback,
1276+
)?;
1277+
}
12631278

12641279
block = db.block_def_map(block_id).parent().and_then(|module| module.containing_block());
12651280
}

0 commit comments

Comments
 (0)