fe_mir/ir/
constant.rs

1use fe_common::impl_intern_key;
2use num_bigint::BigInt;
3use smol_str::SmolStr;
4
5use fe_analyzer::{context, namespace::items as analyzer_items};
6
7use super::{SourceInfo, TypeId};
8
9#[derive(Debug, Clone, PartialEq, Eq, Hash)]
10pub struct Constant {
11    /// A name of a constant.
12    pub name: SmolStr,
13
14    /// A value of a constant.
15    pub value: ConstantValue,
16
17    /// A type of a constant.
18    pub ty: TypeId,
19
20    /// A module where a constant is declared.
21    pub module_id: analyzer_items::ModuleId,
22
23    /// A span where a constant is declared.
24    pub source: SourceInfo,
25}
26
27/// An interned Id for [`Constant`].
28#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
29pub struct ConstantId(pub(crate) u32);
30impl_intern_key!(ConstantId);
31
32#[derive(Debug, Clone, PartialEq, Eq, Hash)]
33pub enum ConstantValue {
34    Immediate(BigInt),
35    Str(SmolStr),
36    Bool(bool),
37}
38
39impl From<context::Constant> for ConstantValue {
40    fn from(value: context::Constant) -> Self {
41        match value {
42            context::Constant::Int(num) | context::Constant::Address(num) => Self::Immediate(num),
43            context::Constant::Str(s) => Self::Str(s),
44            context::Constant::Bool(b) => Self::Bool(b),
45        }
46    }
47}