use std::marker::PhantomData;
use crate::common::ItemId;
#[repr(C)]
#[derive(Debug)]
#[cfg_attr(feature = "driver-api", derive(typed_builder::TypedBuilder))]
pub struct Visibility<'ast> {
#[cfg_attr(feature = "driver-api", builder(setter(skip), default))]
_lifetime: PhantomData<&'ast ()>,
kind: VisibilityKind,
}
impl<'ast> Visibility<'ast> {
pub fn is_pub(&self) -> bool {
self.scope().is_none()
}
pub fn is_crate_scoped(&self) -> bool {
matches!(self.kind, VisibilityKind::Crate(_) | VisibilityKind::DefaultCrate(_))
}
pub fn is_default(&self) -> bool {
match self.kind {
VisibilityKind::DefaultPub | VisibilityKind::DefaultCrate(_) | VisibilityKind::Default(_) => true,
VisibilityKind::Public | VisibilityKind::Crate(_) | VisibilityKind::Path(_) => false,
}
}
pub fn scope(&self) -> Option<ItemId> {
match self.kind {
VisibilityKind::Path(id)
| VisibilityKind::Crate(id)
| VisibilityKind::DefaultCrate(id)
| VisibilityKind::Default(id) => Some(id),
VisibilityKind::Public | VisibilityKind::DefaultPub => None,
}
}
}
#[derive(Debug)]
#[allow(clippy::exhaustive_enums)]
#[cfg_attr(feature = "driver-api", visibility::make(pub))]
enum VisibilityKind {
Public,
DefaultPub,
Crate(ItemId),
DefaultCrate(ItemId),
Path(ItemId),
Default(ItemId),
}