cairo-lang-plugins 2.1.2

Cairo core plugin implementations.
Documentation
use cairo_lang_syntax::node::TypedSyntaxNode;

use crate::plugins::InlineMacro;

pub struct ArrayMacro;
impl InlineMacro for ArrayMacro {
    fn append_macro_code(
        &self,
        macro_expander_data: &mut crate::plugins::InlineMacroExpanderData,
        db: &dyn cairo_lang_syntax::node::db::SyntaxGroup,
        macro_arguments: &cairo_lang_syntax::node::ast::ExprList,
    ) {
        let args = macro_arguments.elements(db);
        let mut expanded_code = "{
            let mut __array_builder_macro_result__ = ArrayTrait::new();"
            .to_string();
        for arg in args {
            expanded_code.push_str(&format!(
                "\n            array::ArrayTrait::append(ref __array_builder_macro_result__, {});",
                arg.as_syntax_node().get_text(db)
            ));
        }
        expanded_code.push_str(
            "\n            __array_builder_macro_result__
        }",
        );
        macro_expander_data.result_code.push_str(&expanded_code);
        macro_expander_data.code_changed = true;
    }

    fn is_bracket_type_allowed(
        &self,
        db: &dyn cairo_lang_syntax::node::db::SyntaxGroup,
        macro_ast: &cairo_lang_syntax::node::ast::ExprInlineMacro,
    ) -> bool {
        matches!(
            macro_ast.arguments(db),
            cairo_lang_syntax::node::ast::WrappedExprList::BracketedExprList(_)
        )
    }
}