1use rustc_data_structures::fx::FxIndexMap;
2use rustc_hir::attrs::{AttributeKind, EiiDecl, EiiImpl};
3use rustc_hir::def_id::DefId;
4use rustc_hir::find_attr;
5use rustc_middle::query::LocalCrate;
6use rustc_middle::ty::TyCtxt;
7
8pub(crate) type EiiMapEncodedKeyValue = (DefId, (EiiDecl, Vec<(DefId, EiiImpl)>));
10
11pub(crate) type EiiMap = FxIndexMap<
12 DefId, (
14 EiiDecl,
16 FxIndexMap<DefId, EiiImpl>,
20 ),
21>;
22
23pub(crate) fn collect<'tcx>(tcx: TyCtxt<'tcx>, LocalCrate: LocalCrate) -> EiiMap {
24 let mut eiis = EiiMap::default();
25
26 for id in tcx.hir_crate_items(()).eiis() {
28 for i in
29 find_attr!(tcx.get_all_attrs(id), AttributeKind::EiiImpls(e) => e).into_iter().flatten()
30 {
31 eiis.entry(i.eii_macro)
32 .or_insert_with(|| {
33 (find_attr!(tcx.get_all_attrs(i.eii_macro), AttributeKind::EiiExternTarget(d) => *d).unwrap(), Default::default())
35 }).1.insert(id.into(), *i);
36 }
37
38 if let Some(decl) =
40 find_attr!(tcx.get_all_attrs(id), AttributeKind::EiiExternTarget(d) => *d)
41 {
42 eiis.entry(id.into()).or_insert((decl, Default::default()));
43 }
44 }
45
46 eiis
47}