@@ -8,8 +8,8 @@ use arrayvec::ArrayVec;
8
8
use base_db:: CrateId ;
9
9
use chalk_ir:: { cast:: Cast , Mutability , UniverseIndex } ;
10
10
use hir_def:: {
11
- lang_item:: LangItemTarget , AssocContainerId , AssocItemId , FunctionId , GenericDefId , HasModule ,
12
- ImplId , Lookup , ModuleId , TraitId ,
11
+ lang_item:: LangItemTarget , nameres :: DefMap , AssocContainerId , AssocItemId , FunctionId ,
12
+ GenericDefId , HasModule , ImplId , Lookup , ModuleId , TraitId ,
13
13
} ;
14
14
use hir_expand:: name:: Name ;
15
15
use rustc_hash:: { FxHashMap , FxHashSet } ;
@@ -100,25 +100,38 @@ impl TraitImpls {
100
100
let mut impls = Self { map : FxHashMap :: default ( ) } ;
101
101
102
102
let crate_def_map = db. crate_def_map ( krate) ;
103
- for ( _module_id, module_data) in crate_def_map. modules ( ) {
104
- for impl_id in module_data. scope . impls ( ) {
105
- let target_trait = match db. impl_trait ( impl_id) {
106
- Some ( tr) => tr. skip_binders ( ) . hir_trait_id ( ) ,
107
- None => continue ,
108
- } ;
109
- let self_ty = db. impl_self_ty ( impl_id) ;
110
- let self_ty_fp = TyFingerprint :: for_impl ( self_ty. skip_binders ( ) ) ;
111
- impls
112
- . map
113
- . entry ( target_trait)
114
- . or_default ( )
115
- . entry ( self_ty_fp)
116
- . or_default ( )
117
- . push ( impl_id) ;
103
+ collect_def_map ( db, & crate_def_map, & mut impls) ;
104
+
105
+ return Arc :: new ( impls) ;
106
+
107
+ fn collect_def_map ( db : & dyn HirDatabase , def_map : & DefMap , impls : & mut TraitImpls ) {
108
+ for ( _module_id, module_data) in def_map. modules ( ) {
109
+ for impl_id in module_data. scope . impls ( ) {
110
+ let target_trait = match db. impl_trait ( impl_id) {
111
+ Some ( tr) => tr. skip_binders ( ) . hir_trait_id ( ) ,
112
+ None => continue ,
113
+ } ;
114
+ let self_ty = db. impl_self_ty ( impl_id) ;
115
+ let self_ty_fp = TyFingerprint :: for_impl ( self_ty. skip_binders ( ) ) ;
116
+ impls
117
+ . map
118
+ . entry ( target_trait)
119
+ . or_default ( )
120
+ . entry ( self_ty_fp)
121
+ . or_default ( )
122
+ . push ( impl_id) ;
123
+ }
124
+
125
+ // To better support custom derives, collect impls in all unnamed const items.
126
+ // const _: () = { ... };
127
+ for konst in module_data. scope . unnamed_consts ( ) {
128
+ let body = db. body ( konst. into ( ) ) ;
129
+ for ( _, block_def_map) in body. blocks ( db. upcast ( ) ) {
130
+ collect_def_map ( db, & block_def_map, impls) ;
131
+ }
132
+ }
118
133
}
119
134
}
120
-
121
- Arc :: new ( impls)
122
135
}
123
136
124
137
pub ( crate ) fn trait_impls_in_deps_query ( db : & dyn HirDatabase , krate : CrateId ) -> Arc < Self > {
@@ -208,6 +221,9 @@ impl InherentImpls {
208
221
}
209
222
}
210
223
224
+ // NOTE: We're not collecting inherent impls from unnamed consts here, we intentionally only
225
+ // support trait impls there.
226
+
211
227
Arc :: new ( Self { map } )
212
228
}
213
229
0 commit comments