cairo_lang_semantic/
literals.rs1use cairo_lang_defs::ids::NamedLanguageElementId;
2use cairo_lang_diagnostics::ToOption;
3use cairo_lang_utils::{require, try_extract_matches};
4use id_arena::Arena;
5use num_bigint::BigInt;
6
7use crate::corelib::{CoreTraitContext, get_core_trait};
8use crate::db::SemanticGroup;
9use crate::items::functions::GenericFunctionId;
10use crate::{Expr, ExprFunctionCall, ExprFunctionCallArg};
11
12pub fn try_extract_minus_literal(
15 db: &dyn SemanticGroup,
16 exprs: &Arena<Expr>,
17 expr: &ExprFunctionCall,
18) -> Option<BigInt> {
19 let [ExprFunctionCallArg::Value(expr_id)] = &expr.args[..] else {
20 return None;
21 };
22 require(expr.coupon_arg.is_none())?;
23 let literal = try_extract_matches!(&exprs[*expr_id], Expr::Literal)?;
24 let imp = try_extract_matches!(
25 expr.function.get_concrete(db).generic_function,
26 GenericFunctionId::Impl
27 )?;
28 let trait_id = imp.impl_id.concrete_trait(db).to_option()?.trait_id(db);
29 require(trait_id == get_core_trait(db, CoreTraitContext::TopLevel, "Neg".into()))?;
30 if imp.function.name(db.upcast()) != "neg" { None } else { Some(-literal.value.clone()) }
31}