Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/utils.rs')
-rw-r--r--crates/hir-ty/src/utils.rs65
1 files changed, 7 insertions, 58 deletions
diff --git a/crates/hir-ty/src/utils.rs b/crates/hir-ty/src/utils.rs
index 148300deb8..be64f55ea5 100644
--- a/crates/hir-ty/src/utils.rs
+++ b/crates/hir-ty/src/utils.rs
@@ -1,28 +1,19 @@
//! Helper functions for working with def, which don't need to be a separate
//! query, but can't be computed directly from `*Data` (ie, which need a `db`).
-use std::cell::LazyCell;
-
use base_db::target::{self, TargetData};
use hir_def::{
- EnumId, EnumVariantId, FunctionId, Lookup, TraitId,
- attrs::AttrFlags,
- db::DefDatabase,
- hir::generics::WherePredicate,
- lang_item::LangItems,
- resolver::{HasResolver, TypeNs},
- type_ref::{TraitBoundModifier, TypeRef},
+ EnumId, EnumVariantId, FunctionId, Lookup, TraitId, attrs::AttrFlags, lang_item::LangItems,
};
use intern::sym;
use rustc_abi::TargetDataLayout;
-use smallvec::{SmallVec, smallvec};
use span::Edition;
use crate::{
TargetFeatures,
db::HirDatabase,
layout::{Layout, TagEncoding},
- lower::all_supertraits_trait_refs,
+ lower::SupertraitsInfo,
mir::pad16,
};
@@ -51,55 +42,13 @@ pub(crate) fn fn_traits(lang_items: &LangItems) -> impl Iterator<Item = TraitId>
}
/// Returns an iterator over the direct super traits (including the trait itself).
-pub fn direct_super_traits(db: &dyn DefDatabase, trait_: TraitId) -> SmallVec<[TraitId; 4]> {
- let mut result = smallvec![trait_];
- direct_super_traits_cb(db, trait_, |tt| {
- if !result.contains(&tt) {
- result.push(tt);
- }
- });
- result
-}
-
-/// Returns an iterator over the whole super trait hierarchy (including the
-/// trait itself).
-pub fn all_super_traits(db: &dyn HirDatabase, trait_: TraitId) -> SmallVec<[TraitId; 4]> {
- let mut supertraits = all_supertraits_trait_refs(db, trait_)
- .map(|trait_ref| trait_ref.skip_binder().def_id.0)
- .collect::<SmallVec<[_; _]>>();
- supertraits.sort_unstable();
- supertraits.dedup();
- supertraits
+pub fn direct_super_traits(db: &dyn HirDatabase, trait_: TraitId) -> &[TraitId] {
+ &SupertraitsInfo::query(db, trait_).direct_supertraits
}
-fn direct_super_traits_cb(db: &dyn DefDatabase, trait_: TraitId, cb: impl FnMut(TraitId)) {
- let resolver = LazyCell::new(|| trait_.resolver(db));
- let (generic_params, store) = db.generic_params_and_store(trait_.into());
- let trait_self = generic_params.trait_self_param();
- generic_params
- .where_predicates()
- .iter()
- .filter_map(|pred| match pred {
- WherePredicate::ForLifetime { target, bound, .. }
- | WherePredicate::TypeBound { target, bound } => {
- let is_trait = match &store[*target] {
- TypeRef::Path(p) => p.is_self_type(),
- TypeRef::TypeParam(p) => Some(p.local_id()) == trait_self,
- _ => false,
- };
- match is_trait {
- true => bound.as_path(&store),
- false => None,
- }
- }
- WherePredicate::Lifetime { .. } => None,
- })
- .filter(|(_, bound_modifier)| matches!(bound_modifier, TraitBoundModifier::None))
- .filter_map(|(path, _)| match resolver.resolve_path_in_type_ns_fully(db, path) {
- Some(TypeNs::TraitId(t)) => Some(t),
- _ => None,
- })
- .for_each(cb);
+/// Returns the whole super trait hierarchy (including the trait itself).
+pub fn all_super_traits(db: &dyn HirDatabase, trait_: TraitId) -> &[TraitId] {
+ &SupertraitsInfo::query(db, trait_).all_supertraits
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]