equi_ty/extractor/
callbacks.rs1use 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 let mut visitor = StructEnumVisitor::new(tcx);
24 tcx.hir_walk_toplevel_module(&mut visitor);
25
26 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!("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}