cairo_lang_plugins/plugins/
compile_error.rs

1use cairo_lang_defs::extract_macro_single_unnamed_arg;
2use cairo_lang_defs::plugin::{MacroPlugin, MacroPluginMetadata, PluginDiagnostic, PluginResult};
3use cairo_lang_defs::plugin_utils::PluginResultTrait;
4use cairo_lang_syntax::node::db::SyntaxGroup;
5use cairo_lang_syntax::node::{Terminal, TypedSyntaxNode, ast};
6
7/// Plugin that allows writing item level `compile_error!` causing a diagnostic.
8/// Useful for testing that `cfg` attributes are valid.
9#[derive(Debug, Default)]
10#[non_exhaustive]
11pub struct CompileErrorPlugin;
12
13impl MacroPlugin for CompileErrorPlugin {
14    fn generate_code(
15        &self,
16        db: &dyn SyntaxGroup,
17        item_ast: ast::ModuleItem,
18        _metadata: &MacroPluginMetadata<'_>,
19    ) -> PluginResult {
20        if let ast::ModuleItem::InlineMacro(inline_macro_ast) = item_ast {
21            if inline_macro_ast.name(db).text(db) == "compile_error" {
22                let compilation_error_arg = extract_macro_single_unnamed_arg!(
23                    db,
24                    &inline_macro_ast,
25                    ast::WrappedArgList::ParenthesizedArgList(_)
26                );
27                let ast::Expr::String(err_message) = compilation_error_arg else {
28                    return PluginResult::diagnostic_only(PluginDiagnostic::error(
29                        &compilation_error_arg,
30                        "`compiler_error!` argument must be an unnamed string argument."
31                            .to_string(),
32                    ));
33                };
34                return PluginResult::diagnostic_only(PluginDiagnostic::error(
35                    &inline_macro_ast,
36                    err_message.text(db).to_string(),
37                ));
38            }
39        }
40        PluginResult { code: None, diagnostics: vec![], remove_original_item: false }
41    }
42
43    fn declared_attributes(&self) -> Vec<String> {
44        vec![]
45    }
46}