teo_parser/expr/
expr_info.rs1use 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}