equi_ty/extractor/
callbacks.rs

1use color_eyre::eyre;
2use rustc_middle::ty::TyCtxt;
3use tracing::trace;
4
5use super::plugin::ExtractorPluginArgs;
6use crate::extractor::visitors::{ImplVisitor, StructEnumVisitor};
7use crate::utils_misc;
8
9#[derive(Debug, Copy, Clone)]
10pub struct ExtractorCallbacks;
11
12impl ExtractorCallbacks {
13    pub fn new(args: &ExtractorPluginArgs) -> Self {
14        Self {}
15    }
16
17    #[allow(clippy::unused_self)]
18    #[allow(clippy::unnecessary_wraps)]
19    fn analyze(&mut self, tcx: TyCtxt<'_>) -> eyre::Result<()> {
20        trace!("analyze() begin.");
21
22        // visit structs/enums first
23        let mut visitor = StructEnumVisitor::new(tcx);
24        tcx.hir_walk_toplevel_module(&mut visitor);
25
26        // now that we have some info about all the local structs/enums
27        // now visit the impls/trait_impls
28        let mut impl_visitor = ImplVisitor::new(tcx, visitor.structs, visitor.enums);
29        tcx.hir_walk_toplevel_module(&mut impl_visitor);
30
31        trace!("visitor (final): \n{impl_visitor:#?}");
32
33        // trace!("all_traits: \n{all_traits:#?}");
34
35        trace!("analyze() end.");
36
37        if utils_misc::should_save_intermediates() {
38            let structs: Vec<_> = impl_visitor.structs.values().collect();
39            utils_misc::save_intermediate(structs, "structs.json");
40            let enums: Vec<_> = impl_visitor.enums.values().collect();
41            utils_misc::save_intermediate(enums, "enums.json");
42        }
43
44        Ok(())
45    }
46}
47
48impl rustc_driver::Callbacks for ExtractorCallbacks {
49    fn after_analysis(
50        &mut self,
51        _compiler: &rustc_interface::interface::Compiler,
52        tcx: TyCtxt<'_>,
53    ) -> rustc_driver::Compilation {
54        self.analyze(tcx).expect("failed while analyzing the crate");
55        rustc_driver::Compilation::Continue
56    }
57}