use crate::config::Config;
use crate::findings::{Dimension, Suppression};
use crate::report::Summary;
pub(super) fn compute_structural(
parsed: &[(String, String, syn::File)],
config: &Config,
) -> Option<crate::structural::StructuralAnalysis> {
if !config.structural.enabled {
return None;
}
Some(crate::structural::analyze_structural(
parsed,
&config.structural,
))
}
pub(super) fn mark_structural_suppressions(
structural: Option<&mut crate::structural::StructuralAnalysis>,
suppression_lines: &std::collections::HashMap<String, Vec<Suppression>>,
) {
let Some(structural) = structural else { return };
structural.warnings.iter_mut().for_each(|w| {
if let Some(sups) = suppression_lines.get(&w.file) {
w.suppressed = sups.iter().any(|sup| {
let in_window = sup.line <= w.line && w.line - sup.line <= 5;
in_window && sup.covers(w.dimension)
});
}
});
}
pub(super) fn count_structural_warnings(
structural: Option<&crate::structural::StructuralAnalysis>,
summary: &mut Summary,
) {
let Some(structural) = structural else { return };
structural
.warnings
.iter()
.filter(|w| !w.suppressed)
.for_each(|w| match w.dimension {
Dimension::Srp => summary.structural_srp_warnings += 1,
Dimension::Coupling => summary.structural_coupling_warnings += 1,
_ => {}
});
}