cairo_lang_test_plugin/
plugin.rs1use cairo_lang_defs::plugin::{MacroPlugin, MacroPluginMetadata, PluginResult};
2use cairo_lang_filesystem::ids::SmolStrId;
3use cairo_lang_syntax::attribute::structured::AttributeListStructurize;
4use cairo_lang_syntax::node::ast;
5use salsa::Database;
6
7use super::{AVAILABLE_GAS_ATTR, IGNORE_ATTR, SHOULD_PANIC_ATTR, TEST_ATTR};
8use crate::test_config::try_extract_test_config;
9
10#[derive(Debug, Default)]
12#[non_exhaustive]
13pub struct TestPlugin;
14
15impl MacroPlugin for TestPlugin {
16 fn generate_code<'db>(
17 &self,
18 db: &'db dyn Database,
19 item_ast: ast::ModuleItem<'db>,
20 _metadata: &MacroPluginMetadata<'_>,
21 ) -> PluginResult<'db> {
22 PluginResult {
23 code: None,
24 diagnostics: if let ast::ModuleItem::FreeFunction(free_func_ast) = item_ast {
25 try_extract_test_config(db, &free_func_ast.attributes(db).structurize(db)).err()
26 } else {
27 None
28 }
29 .unwrap_or_default(),
30 remove_original_item: false,
31 }
32 }
33
34 fn declared_attributes<'db>(&self, db: &'db dyn Database) -> Vec<SmolStrId<'db>> {
35 vec![
36 SmolStrId::from(db, TEST_ATTR),
37 SmolStrId::from(db, AVAILABLE_GAS_ATTR),
38 SmolStrId::from(db, SHOULD_PANIC_ATTR),
39 SmolStrId::from(db, IGNORE_ATTR),
40 ]
41 }
42}