cairo-lang-semantic 2.20.0

Cairo semantic model.
Documentation
//! > Test tuple

//! > test_runner_name
test_expr_semantics(expect_diagnostics: false)

//! > function_body

//! > expr_code
(1 + 2, (2, 3))

//! > expected_semantics
Tuple(
    ExprTuple {
        items: [
            FunctionCall(
                ExprFunctionCall {
                    function: core::Felt252Add::add,
                    args: [
                        Value(
                            Literal(
                                ExprNumericLiteral {
                                    value: 1,
                                    ty: core::felt252,
                                },
                            ),
                        ),
                        Value(
                            Literal(
                                ExprNumericLiteral {
                                    value: 2,
                                    ty: core::felt252,
                                },
                            ),
                        ),
                    ],
                    coupon_arg: None,
                    ty: core::felt252,
                },
            ),
            Tuple(
                ExprTuple {
                    items: [
                        Literal(
                            ExprNumericLiteral {
                                value: 2,
                                ty: core::felt252,
                            },
                        ),
                        Literal(
                            ExprNumericLiteral {
                                value: 3,
                                ty: core::felt252,
                            },
                        ),
                    ],
                    ty: (core::felt252, core::felt252),
                },
            ),
        ],
        ty: (core::felt252, (core::felt252, core::felt252)),
    },
)

//! > expected_diagnostics

//! > ==========================================================================

//! > Test tuple index access

//! > test_runner_name
test_expr_semantics(expect_diagnostics: false)

//! > function_body
let t = (1_felt252, (2_u8, 3_u16));

//! > expr_code
{
    t.0;
    t.1.1;
}

//! > expected_semantics
Block(
    ExprBlock {
        statements: [
            Expr(
                StatementExpr {
                    expr: MemberAccess(
                        ExprMemberAccess {
                            expr: Var(
                                LocalVarId(test::t),
                            ),
                            kind: Index {
                                tuple_ty: (core::felt252, (core::integer::u8, core::integer::u16)),
                                index: 0,
                            },
                            ty: core::felt252,
                        },
                    ),
                },
            ),
            Expr(
                StatementExpr {
                    expr: MemberAccess(
                        ExprMemberAccess {
                            expr: MemberAccess(
                                ExprMemberAccess {
                                    expr: Var(
                                        LocalVarId(test::t),
                                    ),
                                    kind: Index {
                                        tuple_ty: (core::felt252, (core::integer::u8, core::integer::u16)),
                                        index: 1,
                                    },
                                    ty: (core::integer::u8, core::integer::u16),
                                },
                            ),
                            kind: Index {
                                tuple_ty: (core::integer::u8, core::integer::u16),
                                index: 1,
                            },
                            ty: core::integer::u16,
                        },
                    ),
                },
            ),
        ],
        tail: None,
        ty: (),
    },
)

//! > expected_diagnostics

//! > ==========================================================================

//! > Test tuple index access through a snapshot

//! > test_runner_name
test_expr_semantics(expect_diagnostics: false)

//! > function_body
let t = (1_felt252, 2_u8);

//! > expr_code
(@t).1

//! > expected_semantics
MemberAccess(
    ExprMemberAccess {
        expr: Snapshot(
            ExprSnapshot {
                inner: Var(
                    LocalVarId(test::t),
                ),
                ty: @(core::felt252, core::integer::u8),
            },
        ),
        kind: Index {
            tuple_ty: (core::felt252, core::integer::u8),
            index: 1,
        },
        ty: @core::integer::u8,
    },
)

//! > expected_diagnostics

//! > ==========================================================================

//! > Test tuple index access through Deref

//! > test_runner_name
test_expr_semantics(expect_diagnostics: false)

//! > module_code
#[derive(Drop, Copy)]
struct Wrapper {
    inner: (felt252, u8),
}
impl WrapperDeref of core::ops::Deref<Wrapper> {
    type Target = (felt252, u8);
    fn deref(self: Wrapper) -> (felt252, u8) {
        self.inner
    }
}

//! > function_body
let w = Wrapper { inner: (1, 2) };

//! > expr_code
w.1

//! > expected_semantics
MemberAccess(
    ExprMemberAccess {
        expr: FunctionCall(
            ExprFunctionCall {
                function: test::WrapperDeref::deref,
                args: [
                    Value(
                        Var(
                            LocalVarId(test::w),
                        ),
                    ),
                ],
                coupon_arg: None,
                ty: (core::felt252, core::integer::u8),
            },
        ),
        kind: Index {
            tuple_ty: (core::felt252, core::integer::u8),
            index: 1,
        },
        ty: core::integer::u8,
    },
)

//! > expected_diagnostics