teo_parser/expr/
expr_info.rs

1use crate::value::Value;
2use crate::expr::ReferenceInfo;
3use crate::r#type::Type;
4
5#[derive(Debug, Clone)]
6pub struct ExprInfo {
7    pub r#type: Type,
8    pub value: Option<Value>,
9    pub reference_info: Option<ReferenceInfo>,
10}
11
12impl ExprInfo {
13    pub fn new(r#type: Type, value: Option<Value>, reference_info: Option<ReferenceInfo>) -> Self {
14        Self { r#type, value, reference_info }
15    }
16
17    pub fn r#type(&self) -> &Type {
18        &self.r#type
19    }
20
21    pub fn value(&self) -> Option<&Value> {
22        self.value.as_ref()
23    }
24
25    pub fn reference_info(&self) -> Option<&ReferenceInfo> {
26        self.reference_info.as_ref()
27    }
28
29    pub fn is_undetermined(&self) -> bool {
30        self.r#type().is_undetermined()
31    }
32
33    pub fn is_undetermined_anyway(&self) -> bool {
34        self.r#type().is_undetermined() && self.reference_info().is_none()
35    }
36
37    pub fn undetermined() -> Self {
38        ExprInfo {
39            r#type: Type::Undetermined,
40            value: None,
41            reference_info: None,
42        }
43    }
44
45    pub fn type_altered(&self, new_type: Type) -> Self {
46        ExprInfo {
47            r#type: new_type,
48            value: self.value.clone(),
49            reference_info: self.reference_info.clone(),
50        }
51    }
52
53    pub fn reference_only(reference_info: ReferenceInfo) -> Self {
54        Self::new(Type::Undetermined, None, Some(reference_info))
55    }
56
57    pub fn type_only(t: Type) -> Self {
58        Self::new(t, None, None)
59    }
60}