Skip to main content

mago_codex/metadata/
class_like_constant.rs

1use serde::Deserialize;
2use serde::Serialize;
3
4use mago_atom::Atom;
5use mago_span::HasSpan;
6use mago_span::Span;
7
8use crate::metadata::attribute::AttributeMetadata;
9use crate::metadata::flags::MetadataFlags;
10use crate::metadata::ttype::TypeMetadata;
11use crate::ttype::atomic::TAtomic;
12use crate::visibility::Visibility;
13
14#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
15#[non_exhaustive]
16pub struct ClassLikeConstantMetadata {
17    pub attributes: Vec<AttributeMetadata>,
18    pub name: Atom,
19    pub span: Span,
20    pub visibility: Visibility,
21    pub type_declaration: Option<TypeMetadata>,
22    pub type_metadata: Option<TypeMetadata>,
23    pub inferred_type: Option<TAtomic>,
24    pub flags: MetadataFlags,
25}
26
27impl ClassLikeConstantMetadata {
28    #[must_use]
29    pub fn new(name: Atom, span: Span, visibility: Visibility, flags: MetadataFlags) -> Self {
30        Self {
31            attributes: Vec::new(),
32            name,
33            span,
34            visibility,
35            type_declaration: None,
36            type_metadata: None,
37            inferred_type: None,
38            flags,
39        }
40    }
41
42    pub fn set_type_declaration(&mut self, type_declaration: TypeMetadata) {
43        if self.type_metadata.is_none() {
44            self.type_metadata = Some(type_declaration.clone());
45        }
46
47        self.type_declaration = Some(type_declaration);
48    }
49}
50
51impl HasSpan for ClassLikeConstantMetadata {
52    fn span(&self) -> Span {
53        self.span
54    }
55}