mago_reflection/class_like/
member.rs

1use std::hash::Hash;
2
3use ahash::HashMap;
4use ahash::HashSet;
5use serde::Deserialize;
6use serde::Serialize;
7
8use mago_interner::StringIdentifier;
9use mago_span::Span;
10
11use crate::identifier::ClassLikeName;
12
13/// Represents a collection of members (e.g., properties, methods, constants) associated with a class-like entity.
14///
15/// This structure maintains the details of each member, such as their identifiers and inheritance information,
16/// allowing reflection on declared, inherited, overridden, and inheritable members.
17#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
18pub struct MemeberCollection<T: Eq + PartialEq> {
19    pub members: HashMap<StringIdentifier, T>,
20    pub appering_members: HashMap<StringIdentifier, ClassLikeName>,
21    pub declaring_members: HashMap<StringIdentifier, ClassLikeName>,
22    pub overriden_members: HashMap<StringIdentifier, HashSet<ClassLikeName>>,
23    pub inheritable_members: HashMap<StringIdentifier, ClassLikeName>,
24}
25
26impl<T: Eq + PartialEq> Default for MemeberCollection<T> {
27    fn default() -> Self {
28        Self {
29            members: Default::default(),
30            appering_members: Default::default(),
31            declaring_members: Default::default(),
32            overriden_members: Default::default(),
33            inheritable_members: Default::default(),
34        }
35    }
36}
37
38#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash, Serialize, Deserialize, PartialOrd, Ord)]
39pub enum ClassLikeMemberVisibilityReflection {
40    Public { span: Span },
41    Protected { span: Span },
42    Private { span: Span },
43}
44
45impl ClassLikeMemberVisibilityReflection {
46    #[inline]
47    pub const fn is_public(&self) -> bool {
48        matches!(self, ClassLikeMemberVisibilityReflection::Public { .. })
49    }
50
51    #[inline]
52    pub const fn is_protected(&self) -> bool {
53        matches!(self, ClassLikeMemberVisibilityReflection::Protected { .. })
54    }
55
56    #[inline]
57    pub const fn is_private(&self) -> bool {
58        matches!(self, ClassLikeMemberVisibilityReflection::Private { .. })
59    }
60}