cairo_lang_test_plugin/
plugin.rs

1use 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/// Plugin to create diagnostics for tests attributes.
11#[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}