equi_ty/extractor/
plugin.rs1use std::borrow::Cow;
2use std::env;
3use std::process::Command;
4
5use clap::Parser;
6use rustc_driver::TimePassesCallbacks;
7use rustc_plugin::{CrateFilter, RustcPlugin, RustcPluginArgs, Utf8Path};
8use serde::{Deserialize, Serialize};
9use tracing::{debug, trace};
10
11use crate::extractor::callbacks::ExtractorCallbacks;
12use crate::utils_crate;
13
14#[derive(Copy, Clone, Default, Debug)]
17pub struct Plugin {
18 }
24
25#[derive(Debug, Parser, Serialize, Deserialize)]
27pub struct ExtractorPluginArgs {
28 #[clap(last = true)]
39 cargo_args: Vec<String>,
40}
41
42impl RustcPlugin for Plugin {
43 type Args = ExtractorPluginArgs;
44
45 fn version(&self) -> Cow<'static, str> {
46 env!("CARGO_PKG_VERSION").into()
47 }
48
49 fn driver_name(&self) -> Cow<'static, str> {
50 "equity-extractor-driver".into()
51 }
52
53 fn args(&self, _target_dir: &Utf8Path) -> RustcPluginArgs<Self::Args> {
54 let args = ExtractorPluginArgs::parse_from(env::args().skip(1));
55 let filter = CrateFilter::OnlyWorkspace;
56 RustcPluginArgs { args, filter }
57 }
58
59 fn modify_cargo(&self, cargo: &mut Command, args: &Self::Args) {
61 cargo.args(&args.cargo_args);
62 }
63
64 fn run(
67 self,
68 compiler_args: Vec<String>,
69 plugin_args: Self::Args,
70 ) -> rustc_interface::interface::Result<()> {
71 let (should_analyze, opt_typsuffix) = utils_crate::should_analyze_build(&compiler_args)
72 .expect("failed to check if this is a lib");
73
74 if !should_analyze {
75 debug!(">> building normally as should_analyze_build returned false");
78 let mut callbacks = TimePassesCallbacks::default();
79 rustc_driver::run_compiler(&compiler_args, &mut callbacks);
80 return Ok(());
81 }
82
83 let _typsuffix = opt_typsuffix.expect("typsuffix was none!");
84
85 let mut callbacks = ExtractorCallbacks::new(&plugin_args);
86 let mut compiler_args = compiler_args;
87 compiler_args.push("-Awarnings".to_string());
89 trace!(">> compiler_args:\n{compiler_args:#?}");
93
94 debug!(">> starting compiler.run() ...");
95 rustc_driver::run_compiler(&compiler_args, &mut callbacks);
96 debug!(">> compiler.run() finished.");
97
98 Ok(())
105 }
106}