Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/opaques.rs')
-rw-r--r--crates/hir-ty/src/opaques.rs21
1 files changed, 12 insertions, 9 deletions
diff --git a/crates/hir-ty/src/opaques.rs b/crates/hir-ty/src/opaques.rs
index 8531f24377..acf532c5e4 100644
--- a/crates/hir-ty/src/opaques.rs
+++ b/crates/hir-ty/src/opaques.rs
@@ -7,7 +7,6 @@ use hir_expand::name::Name;
use la_arena::ArenaMap;
use rustc_type_ir::inherent::Ty as _;
use syntax::ast;
-use triomphe::Arc;
use crate::{
ImplTraitId,
@@ -29,7 +28,7 @@ pub(crate) fn opaque_types_defined_by(
// A function may define its own RPITs.
extend_with_opaques(
db,
- db.return_type_impl_traits(func),
+ ImplTraits::return_type_impl_traits(db, func),
|opaque_idx| ImplTraitId::ReturnTypeImplTrait(func, opaque_idx),
result,
);
@@ -38,7 +37,7 @@ pub(crate) fn opaque_types_defined_by(
let extend_with_taits = |type_alias| {
extend_with_opaques(
db,
- db.type_alias_impl_traits(type_alias),
+ ImplTraits::type_alias_impl_traits(db, type_alias),
|opaque_idx| ImplTraitId::TypeAliasImplTrait(type_alias, opaque_idx),
result,
);
@@ -75,12 +74,12 @@ pub(crate) fn opaque_types_defined_by(
fn extend_with_opaques<'db>(
db: &'db dyn HirDatabase,
- opaques: Option<Arc<EarlyBinder<'db, ImplTraits<'db>>>>,
+ opaques: &Option<Box<EarlyBinder<'db, ImplTraits<'db>>>>,
mut make_impl_trait: impl FnMut(ImplTraitIdx<'db>) -> ImplTraitId<'db>,
result: &mut Vec<SolverDefId>,
) {
if let Some(opaques) = opaques {
- for (opaque_idx, _) in (*opaques).as_ref().skip_binder().impl_traits.iter() {
+ for (opaque_idx, _) in (**opaques).as_ref().skip_binder().impl_traits.iter() {
let opaque_id = InternedOpaqueTyId::new(db, make_impl_trait(opaque_idx));
result.push(opaque_id.into());
}
@@ -109,6 +108,14 @@ pub(crate) fn tait_hidden_types<'db>(
db: &'db dyn HirDatabase,
type_alias: TypeAliasId,
) -> ArenaMap<ImplTraitIdx<'db>, EarlyBinder<'db, Ty<'db>>> {
+ // Call this first, to not perform redundant work if there are no TAITs.
+ let Some(taits_count) = ImplTraits::type_alias_impl_traits(db, type_alias)
+ .as_deref()
+ .map(|taits| taits.as_ref().skip_binder().impl_traits.len())
+ else {
+ return ArenaMap::new();
+ };
+
let loc = type_alias.loc(db);
let module = loc.module(db);
let interner = DbInterner::new_with(db, Some(module.krate()), module.containing_block());
@@ -119,10 +126,6 @@ pub(crate) fn tait_hidden_types<'db>(
let defining_bodies = tait_defining_bodies(db, &loc);
- let taits_count = db
- .type_alias_impl_traits(type_alias)
- .map_or(0, |taits| (*taits).as_ref().skip_binder().impl_traits.len());
-
let mut result = ArenaMap::with_capacity(taits_count);
for defining_body in defining_bodies {
let infer = db.infer(defining_body);