mago_syntax/ast/ast/
static.rs

1use serde::Deserialize;
2use serde::Serialize;
3use strum::Display;
4
5use mago_span::HasSpan;
6use mago_span::Span;
7
8use crate::ast::ast::expression::Expression;
9use crate::ast::ast::keyword::Keyword;
10use crate::ast::ast::terminator::Terminator;
11use crate::ast::ast::variable::DirectVariable;
12use crate::ast::sequence::TokenSeparatedSequence;
13
14#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize, PartialOrd, Ord)]
15#[repr(C)]
16pub struct Static {
17    pub r#static: Keyword,
18    pub items: TokenSeparatedSequence<StaticItem>,
19    pub terminator: Terminator,
20}
21
22#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize, PartialOrd, Ord, Display)]
23#[serde(tag = "type", content = "value")]
24#[repr(C, u8)]
25pub enum StaticItem {
26    Abstract(StaticAbstractItem),
27    Concrete(StaticConcreteItem),
28}
29
30#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize, PartialOrd, Ord)]
31#[repr(C)]
32pub struct StaticAbstractItem {
33    pub variable: DirectVariable,
34}
35
36#[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize, PartialOrd, Ord)]
37#[repr(C)]
38pub struct StaticConcreteItem {
39    pub variable: DirectVariable,
40    pub equals: Span,
41    pub value: Expression,
42}
43
44impl StaticItem {
45    pub fn variable(&self) -> &DirectVariable {
46        match self {
47            StaticItem::Abstract(item) => &item.variable,
48            StaticItem::Concrete(item) => &item.variable,
49        }
50    }
51
52    pub fn value(&self) -> Option<&Expression> {
53        match self {
54            StaticItem::Abstract(_) => None,
55            StaticItem::Concrete(item) => Some(&item.value),
56        }
57    }
58}
59
60impl HasSpan for Static {
61    fn span(&self) -> Span {
62        self.r#static.span().join(self.terminator.span())
63    }
64}
65
66impl HasSpan for StaticItem {
67    fn span(&self) -> Span {
68        match self {
69            StaticItem::Abstract(item) => item.span(),
70            StaticItem::Concrete(item) => item.span(),
71        }
72    }
73}
74
75impl HasSpan for StaticAbstractItem {
76    fn span(&self) -> Span {
77        self.variable.span()
78    }
79}
80
81impl HasSpan for StaticConcreteItem {
82    fn span(&self) -> Span {
83        self.variable.span().join(self.value.span())
84    }
85}