mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 11:31:15 +00:00
Don't allocate inherent_impls_in_block
and trait_impls_in_block
if its empty
This commit is contained in:
parent
4e16e0f2c1
commit
c4b3075be0
@ -167,7 +167,7 @@ impl chalk_solve::RustIrDatabase<Interner> for ChalkContext<'_> {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
.map(|block_id| self.db.trait_impls_in_block(block_id));
|
.filter_map(|block_id| self.db.trait_impls_in_block(block_id));
|
||||||
|
|
||||||
let id_to_chalk = |id: hir_def::ImplId| id.to_chalk(self.db);
|
let id_to_chalk = |id: hir_def::ImplId| id.to_chalk(self.db);
|
||||||
let mut result = vec![];
|
let mut result = vec![];
|
||||||
@ -183,7 +183,8 @@ impl chalk_solve::RustIrDatabase<Interner> for ChalkContext<'_> {
|
|||||||
def_blocks
|
def_blocks
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.flatten()
|
.flatten()
|
||||||
.for_each(|it| f(&self.db.trait_impls_in_block(it)));
|
.filter_map(|it| self.db.trait_impls_in_block(it))
|
||||||
|
.for_each(|it| f(&it));
|
||||||
}
|
}
|
||||||
fps => {
|
fps => {
|
||||||
let mut f =
|
let mut f =
|
||||||
@ -198,7 +199,8 @@ impl chalk_solve::RustIrDatabase<Interner> for ChalkContext<'_> {
|
|||||||
def_blocks
|
def_blocks
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.flatten()
|
.flatten()
|
||||||
.for_each(|it| f(&self.db.trait_impls_in_block(it)));
|
.filter_map(|it| self.db.trait_impls_in_block(it))
|
||||||
|
.for_each(|it| f(&it));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,6 +34,8 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
|
|||||||
#[salsa::invoke(crate::infer::infer_query)]
|
#[salsa::invoke(crate::infer::infer_query)]
|
||||||
fn infer_query(&self, def: DefWithBodyId) -> Arc<InferenceResult>;
|
fn infer_query(&self, def: DefWithBodyId) -> Arc<InferenceResult>;
|
||||||
|
|
||||||
|
// region:mir
|
||||||
|
|
||||||
#[salsa::invoke(crate::mir::mir_body_query)]
|
#[salsa::invoke(crate::mir::mir_body_query)]
|
||||||
#[salsa::cycle(crate::mir::mir_body_recover)]
|
#[salsa::cycle(crate::mir::mir_body_recover)]
|
||||||
fn mir_body(&self, def: DefWithBodyId) -> Result<Arc<MirBody>, MirLowerError>;
|
fn mir_body(&self, def: DefWithBodyId) -> Result<Arc<MirBody>, MirLowerError>;
|
||||||
@ -61,20 +63,6 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
|
|||||||
#[salsa::invoke(crate::mir::borrowck_query)]
|
#[salsa::invoke(crate::mir::borrowck_query)]
|
||||||
fn borrowck(&self, def: DefWithBodyId) -> Result<Arc<[BorrowckResult]>, MirLowerError>;
|
fn borrowck(&self, def: DefWithBodyId) -> Result<Arc<[BorrowckResult]>, MirLowerError>;
|
||||||
|
|
||||||
#[salsa::invoke(crate::lower::ty_query)]
|
|
||||||
#[salsa::cycle(crate::lower::ty_recover)]
|
|
||||||
fn ty(&self, def: TyDefId) -> Binders<Ty>;
|
|
||||||
|
|
||||||
#[salsa::invoke(crate::lower::value_ty_query)]
|
|
||||||
fn value_ty(&self, def: ValueTyDefId) -> Binders<Ty>;
|
|
||||||
|
|
||||||
#[salsa::invoke(crate::lower::impl_self_ty_query)]
|
|
||||||
#[salsa::cycle(crate::lower::impl_self_ty_recover)]
|
|
||||||
fn impl_self_ty(&self, def: ImplId) -> Binders<Ty>;
|
|
||||||
|
|
||||||
#[salsa::invoke(crate::lower::const_param_ty_query)]
|
|
||||||
fn const_param_ty(&self, def: ConstParamId) -> Ty;
|
|
||||||
|
|
||||||
#[salsa::invoke(crate::consteval::const_eval_query)]
|
#[salsa::invoke(crate::consteval::const_eval_query)]
|
||||||
#[salsa::cycle(crate::consteval::const_eval_recover)]
|
#[salsa::cycle(crate::consteval::const_eval_recover)]
|
||||||
fn const_eval(
|
fn const_eval(
|
||||||
@ -92,6 +80,22 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
|
|||||||
#[salsa::cycle(crate::consteval::const_eval_discriminant_recover)]
|
#[salsa::cycle(crate::consteval::const_eval_discriminant_recover)]
|
||||||
fn const_eval_discriminant(&self, def: EnumVariantId) -> Result<i128, ConstEvalError>;
|
fn const_eval_discriminant(&self, def: EnumVariantId) -> Result<i128, ConstEvalError>;
|
||||||
|
|
||||||
|
// endregion:mir
|
||||||
|
|
||||||
|
#[salsa::invoke(crate::lower::ty_query)]
|
||||||
|
#[salsa::cycle(crate::lower::ty_recover)]
|
||||||
|
fn ty(&self, def: TyDefId) -> Binders<Ty>;
|
||||||
|
|
||||||
|
#[salsa::invoke(crate::lower::value_ty_query)]
|
||||||
|
fn value_ty(&self, def: ValueTyDefId) -> Binders<Ty>;
|
||||||
|
|
||||||
|
#[salsa::invoke(crate::lower::impl_self_ty_query)]
|
||||||
|
#[salsa::cycle(crate::lower::impl_self_ty_recover)]
|
||||||
|
fn impl_self_ty(&self, def: ImplId) -> Binders<Ty>;
|
||||||
|
|
||||||
|
#[salsa::invoke(crate::lower::const_param_ty_query)]
|
||||||
|
fn const_param_ty(&self, def: ConstParamId) -> Ty;
|
||||||
|
|
||||||
#[salsa::invoke(crate::lower::impl_trait_query)]
|
#[salsa::invoke(crate::lower::impl_trait_query)]
|
||||||
fn impl_trait(&self, def: ImplId) -> Option<Binders<TraitRef>>;
|
fn impl_trait(&self, def: ImplId) -> Option<Binders<TraitRef>>;
|
||||||
|
|
||||||
@ -158,7 +162,7 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
|
|||||||
fn inherent_impls_in_crate(&self, krate: CrateId) -> Arc<InherentImpls>;
|
fn inherent_impls_in_crate(&self, krate: CrateId) -> Arc<InherentImpls>;
|
||||||
|
|
||||||
#[salsa::invoke(InherentImpls::inherent_impls_in_block_query)]
|
#[salsa::invoke(InherentImpls::inherent_impls_in_block_query)]
|
||||||
fn inherent_impls_in_block(&self, block: BlockId) -> Arc<InherentImpls>;
|
fn inherent_impls_in_block(&self, block: BlockId) -> Option<Arc<InherentImpls>>;
|
||||||
|
|
||||||
/// Collects all crates in the dependency graph that have impls for the
|
/// Collects all crates in the dependency graph that have impls for the
|
||||||
/// given fingerprint. This is only used for primitive types and types
|
/// given fingerprint. This is only used for primitive types and types
|
||||||
@ -175,7 +179,7 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
|
|||||||
fn trait_impls_in_crate(&self, krate: CrateId) -> Arc<TraitImpls>;
|
fn trait_impls_in_crate(&self, krate: CrateId) -> Arc<TraitImpls>;
|
||||||
|
|
||||||
#[salsa::invoke(TraitImpls::trait_impls_in_block_query)]
|
#[salsa::invoke(TraitImpls::trait_impls_in_block_query)]
|
||||||
fn trait_impls_in_block(&self, block: BlockId) -> Arc<TraitImpls>;
|
fn trait_impls_in_block(&self, block: BlockId) -> Option<Arc<TraitImpls>>;
|
||||||
|
|
||||||
#[salsa::invoke(TraitImpls::trait_impls_in_deps_query)]
|
#[salsa::invoke(TraitImpls::trait_impls_in_deps_query)]
|
||||||
fn trait_impls_in_deps(&self, krate: CrateId) -> Arc<[Arc<TraitImpls>]>;
|
fn trait_impls_in_deps(&self, krate: CrateId) -> Arc<[Arc<TraitImpls>]>;
|
||||||
|
@ -152,13 +152,20 @@ impl TraitImpls {
|
|||||||
Arc::new(Self::finish(impls))
|
Arc::new(Self::finish(impls))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn trait_impls_in_block_query(db: &dyn HirDatabase, block: BlockId) -> Arc<Self> {
|
pub(crate) fn trait_impls_in_block_query(
|
||||||
|
db: &dyn HirDatabase,
|
||||||
|
block: BlockId,
|
||||||
|
) -> Option<Arc<Self>> {
|
||||||
let _p = profile::span("trait_impls_in_block_query");
|
let _p = profile::span("trait_impls_in_block_query");
|
||||||
let mut impls = FxHashMap::default();
|
let mut impls = FxHashMap::default();
|
||||||
|
|
||||||
Self::collect_def_map(db, &mut impls, &db.block_def_map(block));
|
Self::collect_def_map(db, &mut impls, &db.block_def_map(block));
|
||||||
|
|
||||||
Arc::new(Self::finish(impls))
|
if impls.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(Arc::new(Self::finish(impls)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn trait_impls_in_deps_query(
|
pub(crate) fn trait_impls_in_deps_query(
|
||||||
@ -276,7 +283,10 @@ impl InherentImpls {
|
|||||||
Arc::new(impls)
|
Arc::new(impls)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn inherent_impls_in_block_query(db: &dyn HirDatabase, block: BlockId) -> Arc<Self> {
|
pub(crate) fn inherent_impls_in_block_query(
|
||||||
|
db: &dyn HirDatabase,
|
||||||
|
block: BlockId,
|
||||||
|
) -> Option<Arc<Self>> {
|
||||||
let _p = profile::span("inherent_impls_in_block_query");
|
let _p = profile::span("inherent_impls_in_block_query");
|
||||||
let mut impls = Self { map: FxHashMap::default(), invalid_impls: Vec::default() };
|
let mut impls = Self { map: FxHashMap::default(), invalid_impls: Vec::default() };
|
||||||
|
|
||||||
@ -284,7 +294,11 @@ impl InherentImpls {
|
|||||||
impls.collect_def_map(db, &block_def_map);
|
impls.collect_def_map(db, &block_def_map);
|
||||||
impls.shrink_to_fit();
|
impls.shrink_to_fit();
|
||||||
|
|
||||||
Arc::new(impls)
|
if impls.map.is_empty() && impls.invalid_impls.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(Arc::new(impls))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn shrink_to_fit(&mut self) {
|
fn shrink_to_fit(&mut self) {
|
||||||
@ -732,7 +746,7 @@ fn lookup_impl_assoc_item_for_trait_ref(
|
|||||||
let impls = db.trait_impls_in_deps(env.krate);
|
let impls = db.trait_impls_in_deps(env.krate);
|
||||||
let self_impls = match self_ty.kind(Interner) {
|
let self_impls = match self_ty.kind(Interner) {
|
||||||
TyKind::Adt(id, _) => {
|
TyKind::Adt(id, _) => {
|
||||||
id.0.module(db.upcast()).containing_block().map(|it| db.trait_impls_in_block(it))
|
id.0.module(db.upcast()).containing_block().and_then(|it| db.trait_impls_in_block(it))
|
||||||
}
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
};
|
};
|
||||||
@ -1249,17 +1263,18 @@ fn iterate_inherent_methods(
|
|||||||
};
|
};
|
||||||
|
|
||||||
while let Some(block_id) = block {
|
while let Some(block_id) = block {
|
||||||
let impls = db.inherent_impls_in_block(block_id);
|
if let Some(impls) = db.inherent_impls_in_block(block_id) {
|
||||||
impls_for_self_ty(
|
impls_for_self_ty(
|
||||||
&impls,
|
&impls,
|
||||||
self_ty,
|
self_ty,
|
||||||
table,
|
table,
|
||||||
name,
|
name,
|
||||||
receiver_ty,
|
receiver_ty,
|
||||||
receiver_adjustments.clone(),
|
receiver_adjustments.clone(),
|
||||||
module,
|
module,
|
||||||
callback,
|
callback,
|
||||||
)?;
|
)?;
|
||||||
|
}
|
||||||
|
|
||||||
block = db.block_def_map(block_id).parent().and_then(|module| module.containing_block());
|
block = db.block_def_map(block_id).parent().and_then(|module| module.containing_block());
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user