@@ -43,6 +43,17 @@ pub(crate) fn fn_traits(
43
43
. flat_map ( |it| it. as_trait ( ) )
44
44
}
45
45
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
+
46
57
/// Returns an iterator over the whole super trait hierarchy (including the
47
58
/// trait itself).
48
59
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
54
65
while let Some ( & t) = result. get ( i) {
55
66
// yeah this is quadratic, but trait hierarchies should be flat
56
67
// enough that this doesn't matter
57
- direct_super_traits ( db, t, |tt| {
68
+ direct_super_traits_cb ( db, t, |tt| {
58
69
if !result. contains ( & tt) {
59
70
result. push ( tt) ;
60
71
}
@@ -153,7 +164,7 @@ impl Iterator for ClauseElaborator<'_> {
153
164
}
154
165
}
155
166
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 ) ) {
157
168
let resolver = trait_. resolver ( db) ;
158
169
let generic_params = db. generic_params ( trait_. into ( ) ) ;
159
170
let trait_self = generic_params. trait_self_param ( ) ;
0 commit comments