use {
crate::core::SymbolPath,
std::{fmt::Debug, hash::Hash},
};
pub trait Visibility:
Copy + Debug + Clone + PartialEq + Eq + Hash + Send + Sync + 'static
{
fn is_visible_from<P: SymbolPath>(
&self,
defined_at: &P,
referenced_from: &P,
) -> bool {
let _ = (defined_at, referenced_from);
true
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum SymbolVisibility {
#[default]
Private,
Public,
}
impl Visibility for SymbolVisibility {
fn is_visible_from<P: SymbolPath>(
&self,
defined_at: &P,
referenced_from: &P,
) -> bool {
match self {
| SymbolVisibility::Public => true,
| SymbolVisibility::Private => {
laburnum::PartitionSortKey::is_prefix_of(defined_at, referenced_from)
},
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn public_is_visible_everywhere() {
let defined = "a.b".to_string();
let from = "x.y".to_string();
assert!(SymbolVisibility::Public.is_visible_from(&defined, &from));
}
#[test]
fn private_visible_within_subtree() {
let defined = "a.b".to_string();
let from = "a.b.c".to_string();
assert!(SymbolVisibility::Private.is_visible_from(&defined, &from));
}
#[test]
fn private_hidden_outside_subtree() {
let defined = "a.b".to_string();
let from = "a.c".to_string();
assert!(!SymbolVisibility::Private.is_visible_from(&defined, &from));
}
#[test]
fn default_is_private() {
assert_eq!(SymbolVisibility::default(), SymbolVisibility::Private);
}
}