Unnamed repository; edit this file 'description' to name the repository.
Add `pub fn direct_super_traits(db, trait_id)` to `hir_ty` crate
Vincent Esche 2024-11-06
parent 5a9767b · commit c115521
-rw-r--r--crates/hir-ty/src/lib.rs2
-rw-r--r--crates/hir-ty/src/utils.rs15
2 files changed, 14 insertions, 3 deletions
diff --git a/crates/hir-ty/src/lib.rs b/crates/hir-ty/src/lib.rs
index 9c1d8bcf36..22e7b1d920 100644
--- a/crates/hir-ty/src/lib.rs
+++ b/crates/hir-ty/src/lib.rs
@@ -98,7 +98,7 @@ pub use mapping::{
};
pub use method_resolution::check_orphan_rules;
pub use traits::TraitEnvironment;
-pub use utils::{all_super_traits, is_fn_unsafe_to_call};
+pub use utils::{all_super_traits, direct_super_traits, is_fn_unsafe_to_call};
pub use chalk_ir::{
cast::Cast,
diff --git a/crates/hir-ty/src/utils.rs b/crates/hir-ty/src/utils.rs
index 7429ce3c73..28bda1e10e 100644
--- a/crates/hir-ty/src/utils.rs
+++ b/crates/hir-ty/src/utils.rs
@@ -43,6 +43,17 @@ pub(crate) fn fn_traits(
.flat_map(|it| it.as_trait())
}
+/// 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 DefDatabase, trait_: TraitId) -> SmallVec<[TraitId; 4]> {
@@ -54,7 +65,7 @@ pub fn all_super_traits(db: &dyn DefDatabase, trait_: TraitId) -> SmallVec<[Trai
while let Some(&t) = result.get(i) {
// yeah this is quadratic, but trait hierarchies should be flat
// enough that this doesn't matter
- direct_super_traits(db, t, |tt| {
+ direct_super_traits_cb(db, t, |tt| {
if !result.contains(&tt) {
result.push(tt);
}
@@ -153,7 +164,7 @@ impl Iterator for ClauseElaborator<'_> {
}
}
-fn direct_super_traits(db: &dyn DefDatabase, trait_: TraitId, cb: impl FnMut(TraitId)) {
+fn direct_super_traits_cb(db: &dyn DefDatabase, trait_: TraitId, cb: impl FnMut(TraitId)) {
let resolver = trait_.resolver(db);
let generic_params = db.generic_params(trait_.into());
let trait_self = generic_params.trait_self_param();