cairo_lang_semantic/items/
fmt.rs

1use cairo_lang_debug::DebugWithDb;
2use cairo_lang_defs::ids::NamedLanguageElementId;
3use cairo_lang_utils::Upcast;
4
5use super::constant::ConstValue;
6use crate::db::SemanticGroup;
7use crate::{ConcreteVariant, MatchArmSelector};
8
9impl<Db: ?Sized + Upcast<dyn SemanticGroup + 'static>> DebugWithDb<Db> for ConstValue {
10    fn fmt(&self, f: &mut std::fmt::Formatter<'_>, db: &Db) -> std::fmt::Result {
11        let db = db.upcast();
12        match self {
13            ConstValue::Int(value, _ty) => write!(f, "{}", value),
14            ConstValue::Struct(inner, _) => {
15                write!(f, "{{")?;
16                let mut inner = inner.iter().peekable();
17                while let Some(value) = inner.next() {
18                    write!(f, " ")?;
19                    value.fmt(f, db)?;
20                    write!(f, ": ")?;
21                    value.ty(db).unwrap().fmt(f, db.elongate())?;
22                    if inner.peek().is_some() {
23                        write!(f, ",")?;
24                    } else {
25                        write!(f, " ")?;
26                    }
27                }
28                write!(f, "}}")
29            }
30            ConstValue::Enum(variant, inner) => {
31                variant.fmt(f, db)?;
32                write!(f, "(")?;
33                inner.fmt(f, db)?;
34                write!(f, ")")
35            }
36            ConstValue::NonZero(value) => {
37                write!(f, "NonZero(")?;
38                value.fmt(f, db)?;
39                write!(f, ")")
40            }
41            ConstValue::Boxed(value) => {
42                value.fmt(f, db)?;
43                write!(f, ".into_box()")
44            }
45            ConstValue::Generic(param) => write!(f, "{}", param.debug_name(db.upcast())),
46            ConstValue::Var(var, _) => write!(f, "?{}", var.id.0),
47            ConstValue::Missing(_) => write!(f, "missing"),
48            ConstValue::ImplConstant(id) => id.fmt(f, db),
49            ConstValue::TraitConstant(id) => id.fmt(f, db),
50        }
51    }
52}
53
54impl<Db: ?Sized + Upcast<dyn SemanticGroup + 'static>> DebugWithDb<Db> for ConcreteVariant {
55    fn fmt(&self, f: &mut std::fmt::Formatter<'_>, db: &Db) -> std::fmt::Result {
56        let db = db.upcast();
57        let enum_name = self.concrete_enum_id.enum_id(db.upcast()).name(db.upcast());
58        let variant_name = self.id.name(db.upcast());
59        write!(f, "{enum_name}::{variant_name}")
60    }
61}
62
63impl<Db: ?Sized + Upcast<dyn SemanticGroup + 'static>> DebugWithDb<Db> for MatchArmSelector {
64    fn fmt(&self, f: &mut std::fmt::Formatter<'_>, db: &Db) -> std::fmt::Result {
65        let db = db.upcast();
66        match self {
67            MatchArmSelector::VariantId(variant_id) => {
68                write!(f, "{:?}", variant_id.debug(db))
69            }
70            MatchArmSelector::Value(s) => {
71                write!(f, "{:?}", s.value)
72            }
73        }
74    }
75}