use std::collections::HashSet;
use crate::command::{DriverCommand, Registry};
use crate::driver::Phase;
use arena::SyncDroplessArena;
use c2rust_ast_builder::IntoSymbol;
pub mod labeled_ty;
pub mod ownership;
pub mod type_eq;
fn register_test_analysis_type_eq(reg: &mut Registry) {
reg.register("test_analysis_type_eq", |_args| {
Box::new(DriverCommand::new(Phase::Phase3, move |st, cx| {
let result = type_eq::analyze(&cx, &st.krate());
info!("{:?}", result);
}))
});
}
fn register_test_analysis_ownership(reg: &mut Registry) {
reg.register("test_analysis_ownership", |_args| {
Box::new(DriverCommand::new(Phase::Phase3, move |st, cx| {
let arena = SyncDroplessArena::default();
let results = ownership::analyze(&st, &cx, &arena);
ownership::dump_results(&cx, &results);
}))
});
}
fn register_mark_related_types(reg: &mut Registry) {
reg.register("mark_related_types", |args| {
let label = args.get(0).map_or("target", |x| x).into_symbol();
Box::new(DriverCommand::new(Phase::Phase3, move |st, cx| {
let ty_class = type_eq::analyze(&cx, &st.krate());
let mut related_classes = HashSet::new();
for &(id, l) in st.marks().iter() {
if l == label {
let hir_id = cx.hir_map().node_to_hir_id(id);
if let Some(&cls) = ty_class.get(&hir_id) {
related_classes.insert(cls);
}
}
}
for (&id, &cls) in &ty_class {
if related_classes.contains(&cls) {
st.add_mark(cx.hir_map().hir_to_node_id(id), label);
}
}
}))
});
}
pub fn register_commands(reg: &mut Registry) {
register_test_analysis_type_eq(reg);
register_test_analysis_ownership(reg);
register_mark_related_types(reg);
}