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
use cairo_lang_debug::DebugWithDb;
use cairo_lang_defs::db::DefsGroup;
use cairo_lang_defs::ids::LocalVarId;
pub use cairo_lang_defs::ids::{ParamId, VarId};
use cairo_lang_proc_macros::DebugWithDb;
use cairo_lang_syntax::node::ast;
use smol_str::SmolStr;
pub use super::expr::objects::*;
use crate::db::SemanticGroup;
pub use crate::expr::pattern::{
Pattern, PatternEnumVariant, PatternLiteral, PatternOtherwise, PatternStruct, PatternTuple,
PatternVariable,
};
pub use crate::items::enm::{ConcreteVariant, Variant};
pub use crate::items::function_with_body::FunctionBody;
pub use crate::items::functions::{
ConcreteFunction, ConcreteFunctionWithBodyId, FunctionId, FunctionLongId, Signature,
};
pub use crate::items::imp::{ConcreteImplId, ConcreteImplLongId};
pub use crate::items::strct::Member;
pub use crate::items::trt::{ConcreteTraitId, ConcreteTraitLongId};
use crate::literals::LiteralId;
pub use crate::types::{
ConcreteEnumId, ConcreteExternTypeId, ConcreteStructId, ConcreteTypeId, TypeId, TypeLongId,
};
#[derive(Clone, Debug, Hash, PartialEq, Eq, DebugWithDb)]
#[debug_db(dyn SemanticGroup + 'static)]
pub struct LocalVariable {
pub id: LocalVarId,
pub ty: TypeId,
pub is_mut: bool,
}
impl LocalVariable {
pub fn stable_ptr(&self, db: &dyn DefsGroup) -> ast::TerminalIdentifierPtr {
self.id.stable_ptr(db)
}
}
#[derive(Clone, Debug, Hash, PartialEq, Eq, DebugWithDb)]
#[debug_db(dyn SemanticGroup + 'static)]
pub struct Parameter {
pub id: ParamId,
pub name: SmolStr,
pub ty: TypeId,
pub mutability: Mutability,
#[hide_field_debug_with_db]
pub stable_ptr: ast::TerminalIdentifierPtr,
}
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
pub enum Mutability {
Immutable,
Mutable,
Reference,
}
#[derive(Clone, Debug, Hash, PartialEq, Eq, DebugWithDb)]
#[debug_db(dyn SemanticGroup + 'static)]
pub enum Variable {
Local(LocalVariable),
Param(Parameter),
}
impl Variable {
pub fn id(&self) -> VarId {
match self {
Variable::Local(local) => VarId::Local(local.id),
Variable::Param(param) => VarId::Param(param.id),
}
}
pub fn ty(&self) -> TypeId {
match self {
Variable::Local(local) => local.ty,
Variable::Param(param) => param.ty,
}
}
pub fn is_mut(&self) -> bool {
match self {
Variable::Local(local) => local.is_mut,
Variable::Param(param) => param.mutability != Mutability::Immutable,
}
}
}
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
pub enum GenericArgumentId {
Type(TypeId),
Literal(LiteralId),
}
impl DebugWithDb<dyn SemanticGroup> for GenericArgumentId {
fn fmt(
&self,
f: &mut std::fmt::Formatter<'_>,
db: &(dyn SemanticGroup + 'static),
) -> std::fmt::Result {
match self {
GenericArgumentId::Type(id) => write!(f, "{:?}", id.debug(db)),
GenericArgumentId::Literal(id) => write!(f, "{:?}", id.debug(db)),
}
}
}