cargo-mend 0.15.0

Opinionated visibility auditing for Rust crates and workspaces
use super::ItemInfo;
use super::VisibilityContext;
use crate::compiler::settings;
use crate::compiler::visibility::policy;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CrateKind {
    Binary,
    Library,
    IntegrationTest,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ModuleLocation {
    CrateRoot,
    ShallowPrivate,
    Nested,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ParentVisibility {
    Public,
    Private,
}

pub(super) struct VisibilityFindingContext {
    pub(super) crate_kind:        CrateKind,
    pub(super) config_rel_path:   Option<String>,
    pub(super) module_location:   ModuleLocation,
    pub(super) parent_visibility: ParentVisibility,
}

pub(super) fn visibility_finding_context(
    ctx: &VisibilityContext<'_, '_>,
    item: &ItemInfo<'_>,
) -> VisibilityFindingContext {
    let crate_kind = policy::crate_kind_for_root(ctx.root_module, &ctx.settings.package_root);
    let config_rel_path = settings::config_relative_path_for_settings(item.file_path, ctx.settings);
    let parent_module = ctx.tcx.parent_module_from_def_id(item.def_id);
    let parent_visibility = if ctx
        .tcx
        .local_visibility(parent_module.to_local_def_id())
        .is_public()
    {
        ParentVisibility::Public
    } else {
        ParentVisibility::Private
    };
    let module_location = policy::resolve_module_location(ctx.tcx, parent_module.to_local_def_id());

    VisibilityFindingContext {
        crate_kind,
        config_rel_path,
        module_location,
        parent_visibility,
    }
}