use serde::Deserialize;
use serde::Serialize;
use mago_atom::Atom;
use mago_reporting::Issue;
use mago_span::Span;
use crate::metadata::attribute::AttributeMetadata;
use crate::metadata::flags::MetadataFlags;
use crate::metadata::parameter::FunctionLikeParameterMetadata;
use crate::metadata::ttype::TypeMetadata;
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct PropertyHookMetadata {
pub name: Atom,
pub span: Span,
pub flags: MetadataFlags,
pub parameter: Option<FunctionLikeParameterMetadata>,
pub returns_by_ref: bool,
pub is_abstract: bool,
pub attributes: Vec<AttributeMetadata>,
pub return_type_metadata: Option<TypeMetadata>,
pub has_docblock: bool,
pub issues: Vec<Issue>,
}
impl PropertyHookMetadata {
#[inline]
#[must_use]
pub fn new(name: Atom, span: Span) -> Self {
Self {
name,
span,
flags: MetadataFlags::empty(),
parameter: None,
returns_by_ref: false,
is_abstract: false,
attributes: Vec::new(),
return_type_metadata: None,
has_docblock: false,
issues: Vec::new(),
}
}
#[inline]
#[must_use]
pub fn is_get(&self) -> bool {
self.name.as_str() == "get"
}
#[inline]
#[must_use]
pub fn is_set(&self) -> bool {
self.name.as_str() == "set"
}
#[inline]
#[must_use]
pub fn with_flags(mut self, flags: MetadataFlags) -> Self {
self.flags = flags;
self
}
#[inline]
#[must_use]
pub fn with_parameter(mut self, parameter: Option<FunctionLikeParameterMetadata>) -> Self {
self.parameter = parameter;
self
}
#[inline]
#[must_use]
pub fn with_returns_by_ref(mut self, returns_by_ref: bool) -> Self {
self.returns_by_ref = returns_by_ref;
self
}
#[inline]
#[must_use]
pub fn with_is_abstract(mut self, is_abstract: bool) -> Self {
self.is_abstract = is_abstract;
self
}
#[inline]
#[must_use]
pub fn with_attributes(mut self, attributes: Vec<AttributeMetadata>) -> Self {
self.attributes = attributes;
self
}
#[inline]
#[must_use]
pub fn with_return_type_metadata(mut self, return_type_metadata: Option<TypeMetadata>) -> Self {
self.return_type_metadata = return_type_metadata;
self
}
#[inline]
#[must_use]
pub fn with_has_docblock(mut self, has_docblock: bool) -> Self {
self.has_docblock = has_docblock;
self
}
#[inline]
#[must_use]
pub fn with_issues(mut self, issues: Vec<Issue>) -> Self {
self.issues = issues;
self
}
#[inline]
pub fn take_issues(&mut self) -> Vec<Issue> {
std::mem::take(&mut self.issues)
}
}