mago_codex/metadata/
class_like_constant.rs1use 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 #[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 #[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}