Skip to main content

mago_codex/metadata/
class_like_constant.rs

1use mago_php_version::PHPVersion;
2use mago_php_version::PHPVersionRange;
3
4use mago_span::HasSpan;
5use mago_span::Span;
6use mago_word::Word;
7
8use crate::metadata::attribute::AttributeMetadata;
9use crate::metadata::flags::MetadataFlags;
10use crate::metadata::ttype::TypeMetadata;
11use crate::metadata::version_constraint::VersionConstraint;
12use crate::ttype::atomic::TAtomic;
13use crate::visibility::Visibility;
14
15#[derive(Clone, Debug, PartialEq, Eq, Hash)]
16#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17#[non_exhaustive]
18pub struct ClassLikeConstantMetadata {
19    pub attributes: Vec<AttributeMetadata>,
20    pub name: Word,
21    pub span: Span,
22    pub visibility: Visibility,
23    pub type_declaration: Option<TypeMetadata>,
24    pub type_metadata: Option<TypeMetadata>,
25    pub inferred_type: Option<TAtomic>,
26    pub flags: MetadataFlags,
27    pub version_constraint: VersionConstraint,
28}
29
30impl ClassLikeConstantMetadata {
31    #[must_use]
32    pub fn new(name: Word, span: Span, visibility: Visibility, flags: MetadataFlags) -> Self {
33        Self {
34            attributes: Vec::new(),
35            name,
36            span,
37            visibility,
38            type_declaration: None,
39            type_metadata: None,
40            inferred_type: None,
41            flags,
42            version_constraint: VersionConstraint::unconstrained(),
43        }
44    }
45
46    pub fn set_type_declaration(&mut self, type_declaration: TypeMetadata) {
47        if self.type_metadata.is_none() {
48            self.type_metadata = Some(type_declaration.clone());
49        }
50
51        self.type_declaration = Some(type_declaration);
52    }
53
54    /// Returns `true` when this class constant is available in the given PHP
55    /// version.
56    #[inline]
57    #[must_use]
58    pub fn is_available_in_version(&self, version: PHPVersion) -> bool {
59        self.version_constraint.allows_version(version)
60    }
61
62    /// Returns `true` when this class constant is available across the entire
63    /// supplied [`PHPVersionRange`].
64    #[inline]
65    #[must_use]
66    pub fn is_available_in_version_range(&self, range: PHPVersionRange) -> bool {
67        self.version_constraint.allows_version_range(range)
68    }
69}
70
71impl HasSpan for ClassLikeConstantMetadata {
72    fn span(&self) -> Span {
73        self.span
74    }
75}