deslop 0.2.0

A static analyzer that spots low-context and AI-assisted code patterns across naming, concurrency, security, performance, and test quality.
Documentation
mod docs;
mod hygiene;
mod import_resolution;
mod local_calls;

pub(crate) const BINDING_LOCATION: &str = file!();

#[cfg(test)]
pub(crate) fn alias_lookup(
    imports: &[crate::analysis::ImportSpec],
) -> std::collections::BTreeMap<String, crate::analysis::ImportSpec> {
    import_resolution::alias_lookup(imports)
}

#[cfg(test)]
pub(crate) fn call_matches_import(
    index: &crate::index::RepositoryIndex,
    file_path: &std::path::Path,
    import_spec: &crate::analysis::ImportSpec,
) -> bool {
    import_resolution::call_matches_import(index, file_path, import_spec)
}

#[cfg(test)]
pub(crate) fn import_matches_item(
    index: &crate::index::RepositoryIndex,
    file_path: &std::path::Path,
    import_spec: &crate::analysis::ImportSpec,
) -> bool {
    import_resolution::import_matches_item(index, file_path, import_spec)
}

pub(crate) fn doc_marker_findings(
    file: &crate::analysis::ParsedFile,
    function: &crate::analysis::ParsedFunction,
) -> Vec<crate::model::Finding> {
    docs::doc_marker_findings(file, function)
}

pub(crate) fn non_test_call_findings(
    file: &crate::analysis::ParsedFile,
    function: &crate::analysis::ParsedFunction,
    call_name: &str,
    rule_id: &str,
    message_suffix: &str,
) -> Vec<crate::model::Finding> {
    hygiene::non_test_call_findings(file, function, call_name, rule_id, message_suffix)
}

pub(crate) fn non_test_macro_findings(
    file: &crate::analysis::ParsedFile,
    function: &crate::analysis::ParsedFunction,
    macro_name: &str,
    rule_id: &str,
    message_suffix: &str,
) -> Vec<crate::model::Finding> {
    hygiene::non_test_macro_findings(file, function, macro_name, rule_id, message_suffix)
}

pub(crate) fn unsafe_findings(
    file: &crate::analysis::ParsedFile,
    function: &crate::analysis::ParsedFunction,
) -> Vec<crate::model::Finding> {
    hygiene::unsafe_findings(file, function)
}

pub(crate) fn rust_import_findings(
    file: &crate::analysis::ParsedFile,
    function: &crate::analysis::ParsedFunction,
    index: &crate::index::RepositoryIndex,
    imports: &[crate::analysis::ImportSpec],
    current_package: &crate::index::PackageIndex,
) -> Vec<crate::model::Finding> {
    import_resolution::rust_import_findings(file, function, index, imports, current_package)
}

pub(crate) fn rust_call_findings(
    file: &crate::analysis::ParsedFile,
    function: &crate::analysis::ParsedFunction,
    index: &crate::index::RepositoryIndex,
    imports: &[crate::analysis::ImportSpec],
) -> Vec<crate::model::Finding> {
    local_calls::rust_call_findings(file, function, index, imports)
}

fn is_rust_import(import_path: &str) -> bool {
    import_path.starts_with("crate::")
        || import_path.starts_with("self::")
        || import_path.starts_with("super::")
}