impl AnalysisService {
pub(crate) async fn analyze_complexity(
&self,
_path: &Path,
_options: &AnalysisOptions,
) -> Result<ComplexityResults> {
Ok(ComplexityResults {
total_files: 10,
average_complexity: 5.5,
max_complexity: 15,
violations: vec![],
})
}
pub(crate) async fn analyze_satd(
&self,
path: &Path,
_options: &AnalysisOptions,
) -> Result<SatdResults> {
let results = self
.satd_detector
.analyze_project(path, true)
.await
.map_err(|e| anyhow::anyhow!("SATD analysis failed: {e}"))?;
let violations: Vec<SatdViolation> = results
.items
.into_iter()
.map(|debt| SatdViolation {
file: debt.file.to_string_lossy().to_string(),
line: debt.line as usize,
comment: debt.text,
category: format!("{:?}", debt.category),
})
.collect();
Ok(SatdResults {
total_files: results.total_files_analyzed,
total_satd: violations.len(),
violations,
})
}
pub(crate) async fn analyze_dead_code(
&self,
path: &Path,
options: &AnalysisOptions,
) -> Result<DeadCodeResults> {
use crate::models::dead_code::DeadCodeAnalysisConfig;
let config = DeadCodeAnalysisConfig {
include_unreachable: true, include_tests: options.include_tests,
min_dead_lines: 1, };
let mut analyzer = DeadCodeAnalyzer::new(DeadCodeAnalyzer::DEFAULT_CAPACITY);
let analysis_result = analyzer.analyze_with_ranking(path, config).await?;
let unused_items: Vec<UnusedItem> = analysis_result
.ranked_files
.into_iter()
.flat_map(|file| {
file.items.into_iter().map(move |item| UnusedItem {
file: file.path.clone(),
item: item.name.clone(),
line: item.line as usize,
item_type: format!("{:?}", item.item_type),
})
})
.collect();
let total_files = analysis_result.summary.total_files_analyzed;
let dead_code_count = unused_items.len();
let dead_code_percentage = if total_files > 0 {
(dead_code_count as f64 / total_files as f64) * 100.0
} else {
0.0
};
Ok(DeadCodeResults {
total_files,
dead_code_count,
dead_code_percentage,
unused_items,
})
}
}