use serde::Deserialize;
use serde::Serialize;
use mago_span::HasSpan;
use mago_span::Span;
use crate::metadata::attribute::AttributeMetadata;
use crate::metadata::flags::MetadataFlags;
use crate::metadata::ttype::TypeMetadata;
use crate::misc::VariableIdentifier;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[non_exhaustive]
pub struct FunctionLikeParameterMetadata {
pub attributes: Vec<AttributeMetadata>,
pub name: VariableIdentifier,
pub type_declaration_metadata: Option<TypeMetadata>,
pub type_metadata: Option<TypeMetadata>,
pub out_type: Option<TypeMetadata>,
pub default_type: Option<TypeMetadata>,
pub span: Span,
pub name_span: Span,
pub flags: MetadataFlags,
}
impl FunctionLikeParameterMetadata {
#[must_use]
pub fn new(name: VariableIdentifier, span: Span, name_span: Span, flags: MetadataFlags) -> Self {
Self {
attributes: Vec::new(),
name,
flags,
span,
name_span,
type_declaration_metadata: None,
type_metadata: None,
out_type: None,
default_type: None,
}
}
#[inline]
#[must_use]
pub fn get_name(&self) -> &VariableIdentifier {
&self.name
}
#[inline]
#[must_use]
pub fn get_span(&self) -> Span {
self.span
}
#[inline]
#[must_use]
pub fn get_name_span(&self) -> Span {
self.name_span
}
#[inline]
#[must_use]
pub fn get_type_metadata(&self) -> Option<&TypeMetadata> {
self.type_metadata.as_ref()
}
#[inline]
#[must_use]
pub fn get_type_declaration_metadata(&self) -> Option<&TypeMetadata> {
self.type_declaration_metadata.as_ref()
}
#[inline]
#[must_use]
pub fn get_default_type(&self) -> Option<&TypeMetadata> {
self.default_type.as_ref()
}
pub fn set_attributes(&mut self, attributes: impl IntoIterator<Item = AttributeMetadata>) {
self.attributes = attributes.into_iter().collect();
}
pub fn with_attributes(mut self, attributes: impl IntoIterator<Item = AttributeMetadata>) -> Self {
self.set_attributes(attributes);
self
}
#[inline]
pub fn set_type_metadata(&mut self, type_metadata: Option<TypeMetadata>) {
self.type_metadata = type_metadata;
}
#[inline]
pub fn set_type_declaration_metadata(&mut self, type_declaration: Option<TypeMetadata>) {
if self.type_metadata.is_none() {
self.type_metadata.clone_from(&type_declaration);
}
self.type_declaration_metadata = type_declaration;
}
}
impl HasSpan for FunctionLikeParameterMetadata {
fn span(&self) -> Span {
self.span
}
}