cairo_lang_plugins/plugins/
compile_error.rs1use 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#[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}