Skip to content

Commit c2ffafd

Browse files
authored
Merge pull request #18482 from regexident/hir_trait_supertraits_accessors
internal: Add public `direct_supertraits(…)` & `all_supertraits(…)` accessor methods to `hir::Trait`
2 parents a118777 + d5dec8a commit c2ffafd

File tree

3 files changed

+26
-6
lines changed

3 files changed

+26
-6
lines changed

Diff for: src/tools/rust-analyzer/crates/hir-ty/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ pub use mapping::{
9898
};
9999
pub use method_resolution::check_orphan_rules;
100100
pub use traits::TraitEnvironment;
101-
pub use utils::{all_super_traits, is_fn_unsafe_to_call};
101+
pub use utils::{all_super_traits, direct_super_traits, is_fn_unsafe_to_call};
102102

103103
pub use chalk_ir::{
104104
cast::Cast,

Diff for: src/tools/rust-analyzer/crates/hir-ty/src/utils.rs

+13-2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,17 @@ pub(crate) fn fn_traits(
4343
.flat_map(|it| it.as_trait())
4444
}
4545

46+
/// Returns an iterator over the direct super traits (including the trait itself).
47+
pub fn direct_super_traits(db: &dyn DefDatabase, trait_: TraitId) -> SmallVec<[TraitId; 4]> {
48+
let mut result = smallvec![trait_];
49+
direct_super_traits_cb(db, trait_, |tt| {
50+
if !result.contains(&tt) {
51+
result.push(tt);
52+
}
53+
});
54+
result
55+
}
56+
4657
/// Returns an iterator over the whole super trait hierarchy (including the
4758
/// trait itself).
4859
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
5465
while let Some(&t) = result.get(i) {
5566
// yeah this is quadratic, but trait hierarchies should be flat
5667
// enough that this doesn't matter
57-
direct_super_traits(db, t, |tt| {
68+
direct_super_traits_cb(db, t, |tt| {
5869
if !result.contains(&tt) {
5970
result.push(tt);
6071
}
@@ -153,7 +164,7 @@ impl Iterator for ClauseElaborator<'_> {
153164
}
154165
}
155166

156-
fn direct_super_traits(db: &dyn DefDatabase, trait_: TraitId, cb: impl FnMut(TraitId)) {
167+
fn direct_super_traits_cb(db: &dyn DefDatabase, trait_: TraitId, cb: impl FnMut(TraitId)) {
157168
let resolver = trait_.resolver(db);
158169
let generic_params = db.generic_params(trait_.into());
159170
let trait_self = generic_params.trait_self_param();

Diff for: src/tools/rust-analyzer/crates/hir/src/lib.rs

+12-3
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ use hir_ty::{
6868
all_super_traits, autoderef, check_orphan_rules,
6969
consteval::{try_const_usize, unknown_const_as_generic, ConstExt},
7070
diagnostics::BodyValidationDiagnostic,
71-
error_lifetime, known_const_to_ast,
71+
direct_super_traits, error_lifetime, known_const_to_ast,
7272
layout::{Layout as TyLayout, RustcEnumVariantIdx, RustcFieldIdx, TagEncoding},
7373
method_resolution,
7474
mir::{interpret_mir, MutBorrowKind},
@@ -2704,13 +2704,22 @@ impl Trait {
27042704
db.trait_data(self.id).name.clone()
27052705
}
27062706

2707+
pub fn direct_supertraits(self, db: &dyn HirDatabase) -> Vec<Trait> {
2708+
let traits = direct_super_traits(db.upcast(), self.into());
2709+
traits.iter().map(|tr| Trait::from(*tr)).collect()
2710+
}
2711+
2712+
pub fn all_supertraits(self, db: &dyn HirDatabase) -> Vec<Trait> {
2713+
let traits = all_super_traits(db.upcast(), self.into());
2714+
traits.iter().map(|tr| Trait::from(*tr)).collect()
2715+
}
2716+
27072717
pub fn items(self, db: &dyn HirDatabase) -> Vec<AssocItem> {
27082718
db.trait_data(self.id).items.iter().map(|(_name, it)| (*it).into()).collect()
27092719
}
27102720

27112721
pub fn items_with_supertraits(self, db: &dyn HirDatabase) -> Vec<AssocItem> {
2712-
let traits = all_super_traits(db.upcast(), self.into());
2713-
traits.iter().flat_map(|tr| Trait::from(*tr).items(db)).collect()
2722+
self.all_supertraits(db).into_iter().flat_map(|tr| tr.items(db)).collect()
27142723
}
27152724

27162725
pub fn is_auto(self, db: &dyn HirDatabase) -> bool {

0 commit comments

Comments
 (0)