use ahash::HashMap;
use ahash::HashSet;
use serde::Deserialize;
use serde::Serialize;
use mago_interner::StringIdentifier;
use mago_reporting::IssueCollection;
use mago_source::HasSource;
use mago_source::SourceIdentifier;
use mago_span::HasSpan;
use mago_span::Span;
use crate::Reflection;
use crate::attribute::AttributeReflection;
use crate::class_like::constant::ClassLikeConstantReflection;
use crate::class_like::enum_case::EnumCaseReflection;
use crate::class_like::inheritance::InheritanceReflection;
use crate::class_like::member::MemeberCollection;
use crate::class_like::property::PropertyReflection;
use crate::function_like::FunctionLikeReflection;
use crate::identifier::ClassLikeName;
use crate::identifier::Name;
use crate::r#type::TypeReflection;
pub mod constant;
pub mod enum_case;
pub mod inheritance;
pub mod member;
pub mod property;
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub struct ClassLikeReflection {
pub attribute_reflections: Vec<AttributeReflection>,
pub name: ClassLikeName,
pub inheritance: InheritanceReflection,
pub constants: HashMap<StringIdentifier, ClassLikeConstantReflection>,
pub cases: HashMap<StringIdentifier, EnumCaseReflection>,
pub properties: MemeberCollection<PropertyReflection>,
pub methods: MemeberCollection<FunctionLikeReflection>,
pub used_traits: HashSet<Name>,
pub used_trait_names: HashMap<StringIdentifier, Name>,
pub backing_type: Option<TypeReflection>,
pub is_final: bool,
pub is_readonly: bool,
pub is_abstract: bool,
pub is_anonymous: bool,
pub span: Span,
pub is_populated: bool,
pub issues: IssueCollection,
}
impl ClassLikeReflection {
pub fn new(name: ClassLikeName, span: Span) -> Self {
Self {
attribute_reflections: Vec::new(),
name,
inheritance: InheritanceReflection::default(),
constants: HashMap::default(),
cases: HashMap::default(),
properties: MemeberCollection::default(),
methods: MemeberCollection::default(),
used_traits: HashSet::default(),
used_trait_names: HashMap::default(),
backing_type: None,
is_final: false,
is_readonly: false,
is_abstract: false,
is_anonymous: false,
span,
is_populated: false,
issues: IssueCollection::new(),
}
}
#[inline]
pub const fn is_trait(&self) -> bool {
matches!(self.name, ClassLikeName::Trait(_))
}
#[inline]
pub const fn is_interface(&self) -> bool {
matches!(self.name, ClassLikeName::Interface(_))
}
#[inline]
pub const fn is_class(&self) -> bool {
matches!(self.name, ClassLikeName::Class(_))
}
#[inline]
pub const fn is_enum(&self) -> bool {
matches!(self.name, ClassLikeName::Enum(_))
}
#[inline]
pub const fn is_anonymous_class(&self) -> bool {
matches!(self.name, ClassLikeName::AnonymousClass(_))
}
}
impl HasSpan for ClassLikeReflection {
fn span(&self) -> Span {
self.span
}
}
impl HasSource for ClassLikeReflection {
fn source(&self) -> SourceIdentifier {
self.span.source()
}
}
impl Reflection for ClassLikeReflection {
fn get_category(&self) -> crate::SourceCategory {
self.source().category()
}
fn is_populated(&self) -> bool {
self.is_populated
}
fn take_issues(&mut self) -> IssueCollection {
std::mem::take(&mut self.issues)
}
}