1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
use cairo_lang_debug::DebugWithDb;
use cairo_lang_proc_macros::{DebugWithDb, SemanticObject};
use cairo_lang_syntax::node::ast;
use smol_str::SmolStr;
use super::fmt::ExprFormatter;
use crate::corelib::core_felt252_ty;
use crate::db::SemanticGroup;
use crate::{semantic, ConcreteStructId, ExprLiteral, LocalVariable};
#[derive(Clone, Debug, Hash, PartialEq, Eq, DebugWithDb, SemanticObject)]
#[debug_db(ExprFormatter<'a>)]
pub enum Pattern {
Literal(PatternLiteral),
Variable(PatternVariable),
Struct(PatternStruct),
Tuple(PatternTuple),
EnumVariant(PatternEnumVariant),
Otherwise(PatternOtherwise),
}
impl Pattern {
pub fn ty(&self, db: &dyn SemanticGroup) -> semantic::TypeId {
match self {
Pattern::Literal(_) => core_felt252_ty(db),
Pattern::Variable(variable) => variable.var.ty,
Pattern::Struct(pattern_struct) => pattern_struct.ty,
Pattern::Tuple(pattern_tuple) => pattern_tuple.ty,
Pattern::EnumVariant(pattern_enum_variant) => pattern_enum_variant.ty,
Pattern::Otherwise(pattern_otherwise) => pattern_otherwise.ty,
}
}
pub fn variables(&self) -> Vec<&PatternVariable> {
match self {
Pattern::Variable(variable) => vec![variable],
Pattern::Struct(pattern_struct) => pattern_struct
.field_patterns
.iter()
.flat_map(|(_member, pattern)| pattern.variables())
.collect(),
Pattern::Tuple(pattern_tuple) => pattern_tuple
.field_patterns
.iter()
.flat_map(|pattern| pattern.variables())
.collect(),
Pattern::EnumVariant(pattern_enum_variant) => {
pattern_enum_variant.inner_pattern.variables()
}
Pattern::Literal(_) | Pattern::Otherwise(_) => vec![],
}
}
pub fn stable_ptr(&self) -> ast::PatternPtr {
match self {
Pattern::Literal(pat) => pat.stable_ptr,
Pattern::Variable(pat) => pat.stable_ptr,
Pattern::Struct(pat) => pat.stable_ptr.into(),
Pattern::Tuple(pat) => pat.stable_ptr.into(),
Pattern::EnumVariant(pat) => pat.stable_ptr.into(),
Pattern::Otherwise(pat) => pat.stable_ptr.into(),
}
}
}
#[derive(Clone, Debug, Hash, PartialEq, Eq, DebugWithDb, SemanticObject)]
#[debug_db(ExprFormatter<'a>)]
pub struct PatternLiteral {
pub literal: ExprLiteral,
pub ty: semantic::TypeId,
#[hide_field_debug_with_db]
#[dont_rewrite]
pub stable_ptr: ast::PatternPtr,
}
#[derive(Clone, Debug, Hash, PartialEq, Eq, SemanticObject)]
pub struct PatternVariable {
#[dont_rewrite]
pub name: SmolStr,
pub var: LocalVariable,
#[dont_rewrite]
pub stable_ptr: ast::PatternPtr,
}
impl DebugWithDb<ExprFormatter<'_>> for PatternVariable {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>, _db: &ExprFormatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.name)
}
}
#[derive(Clone, Debug, Hash, PartialEq, Eq, DebugWithDb, SemanticObject)]
#[debug_db(ExprFormatter<'a>)]
pub struct PatternStruct {
pub concrete_struct_id: ConcreteStructId,
pub field_patterns: Vec<(semantic::Member, Box<Pattern>)>,
pub ty: semantic::TypeId,
#[dont_rewrite]
pub n_snapshots: usize,
#[hide_field_debug_with_db]
#[dont_rewrite]
pub stable_ptr: ast::PatternStructPtr,
}
#[derive(Clone, Debug, Hash, PartialEq, Eq, DebugWithDb, SemanticObject)]
#[debug_db(ExprFormatter<'a>)]
pub struct PatternTuple {
pub field_patterns: Vec<Box<Pattern>>,
pub ty: semantic::TypeId,
#[hide_field_debug_with_db]
#[dont_rewrite]
pub stable_ptr: ast::PatternTuplePtr,
}
#[derive(Clone, Debug, Hash, PartialEq, Eq, DebugWithDb, SemanticObject)]
#[debug_db(ExprFormatter<'a>)]
pub struct PatternEnumVariant {
pub variant: semantic::ConcreteVariant,
pub inner_pattern: Box<Pattern>,
pub ty: semantic::TypeId,
#[hide_field_debug_with_db]
#[dont_rewrite]
pub stable_ptr: ast::PatternEnumPtr,
}
#[derive(Clone, Debug, Hash, PartialEq, Eq, DebugWithDb, SemanticObject)]
#[debug_db(ExprFormatter<'a>)]
pub struct PatternOtherwise {
pub ty: semantic::TypeId,
#[hide_field_debug_with_db]
#[dont_rewrite]
pub stable_ptr: ast::TerminalUnderscorePtr,
}