pub(super) use crate::adapters::analyzers::iosp::scope::ProjectScope;
pub(super) use crate::adapters::analyzers::iosp::*;
pub(super) use crate::config::Config;
mod analysis_structure;
mod classification_exact;
mod classification_predicate;
mod classify_basics;
mod complexity_and_metadata;
mod dispatch_and_getters;
mod is_test;
mod metrics_exact;
mod own_call_resolution;
mod own_calls_a;
mod own_calls_b;
pub(super) fn parse_and_analyze(code: &str) -> Vec<FunctionAnalysis> {
let syntax = syn::parse_file(code).expect("Failed to parse test code");
let scope_files = vec![("test.rs", &syntax)];
let scope = ProjectScope::from_files(&scope_files);
let config = Config::default();
let analyzer = Analyzer::new(&config, &scope);
let mut results = analyzer.analyze_file(&syntax, "test.rs");
let parsed = vec![("test.rs".to_string(), code.to_string(), syntax)];
let recursive_lines = crate::adapters::source::filesystem::collect_recursive_lines(&parsed);
crate::app::warnings::apply_recursive_annotations(&mut results, &recursive_lines);
crate::app::warnings::apply_leaf_reclassification(&mut results);
results
}
pub(super) fn parse_and_analyze_with_config(code: &str, config: &Config) -> Vec<FunctionAnalysis> {
let syntax = syn::parse_file(code).expect("Failed to parse test code");
let scope_files = vec![("test.rs", &syntax)];
let scope = ProjectScope::from_files(&scope_files);
let analyzer = Analyzer::new(config, &scope);
analyzer.analyze_file(&syntax, "test.rs")
}
pub(super) fn classify(code: &str, fn_name: &str) -> Classification {
parse_and_analyze(code)
.into_iter()
.find(|r| r.name == fn_name)
.unwrap_or_else(|| panic!("fn {fn_name} not found"))
.classification
}
pub(super) fn classify_cfg(code: &str, fn_name: &str, config: &Config) -> Classification {
parse_and_analyze_with_config(code, config)
.into_iter()
.find(|r| r.name == fn_name)
.unwrap_or_else(|| panic!("fn {fn_name} not found"))
.classification
}
pub(super) fn is_test_of(code: &str, fn_name: &str) -> bool {
analysis_of(code, fn_name).is_test
}
pub(super) fn analysis_of(code: &str, name: &str) -> FunctionAnalysis {
parse_and_analyze(code)
.into_iter()
.find(|r| r.name == name)
.unwrap_or_else(|| panic!("fn {name} not found"))
}
pub(super) fn raw_analysis_of(code: &str, name: &str) -> FunctionAnalysis {
parse_and_analyze_with_config(code, &Config::default())
.into_iter()
.find(|r| r.name == name)
.unwrap_or_else(|| panic!("fn {name} not found"))
}
pub(super) fn metrics_of(code: &str) -> ComplexityMetrics {
analysis_of(code, "f")
.complexity
.expect("f should have complexity metrics")
}
pub(super) fn own_calls_of(code: &str, name: &str) -> Vec<String> {
analysis_of(code, name).own_calls
}
pub(super) fn analysed_names(code: &str) -> Vec<String> {
parse_and_analyze(code)
.into_iter()
.map(|r| r.name)
.collect()
}