cairo_lang_semantic/
plugin.rs1use std::any::{self, Any};
2use std::sync::Arc;
3
4use cairo_lang_defs::ids::{InlineMacroExprPluginId, MacroPluginId, ModuleId};
5use cairo_lang_defs::plugin::{InlineMacroExprPlugin, MacroPlugin, NamedPlugin, PluginDiagnostic};
6use cairo_lang_utils::ordered_hash_map::OrderedHashMap;
7
8use crate::db::SemanticGroup;
9use crate::ids::AnalyzerPluginId;
10
11pub trait AnalyzerPlugin: std::fmt::Debug + Sync + Send + Any {
14 fn diagnostics(&self, db: &dyn SemanticGroup, module_id: ModuleId) -> Vec<PluginDiagnostic>;
16 fn declared_allows(&self) -> Vec<String> {
22 Vec::new()
23 }
24
25 fn plugin_type_id(&self) -> any::TypeId {
28 self.type_id()
29 }
30}
31
32#[derive(Clone, Debug, Default)]
34pub struct PluginSuite {
35 pub plugins: Vec<Arc<dyn MacroPlugin>>,
37 pub inline_macro_plugins: OrderedHashMap<String, Arc<dyn InlineMacroExprPlugin>>,
39 pub analyzer_plugins: Vec<Arc<dyn AnalyzerPlugin>>,
41}
42impl PluginSuite {
43 pub fn add_plugin_ex(&mut self, plugin: Arc<dyn MacroPlugin>) -> &mut Self {
45 self.plugins.push(plugin);
46 self
47 }
48 pub fn add_plugin<T: MacroPlugin + Default + 'static>(&mut self) -> &mut Self {
50 self.add_plugin_ex(Arc::new(T::default()))
51 }
52 pub fn add_inline_macro_plugin_ex(
54 &mut self,
55 name: &str,
56 plugin: Arc<dyn InlineMacroExprPlugin>,
57 ) -> &mut Self {
58 self.inline_macro_plugins.insert(name.into(), plugin);
59 self
60 }
61 pub fn add_inline_macro_plugin<T: NamedPlugin + InlineMacroExprPlugin>(&mut self) -> &mut Self {
63 self.add_inline_macro_plugin_ex(T::NAME, Arc::new(T::default()));
64 self
65 }
66 pub fn add_analyzer_plugin_ex(&mut self, plugin: Arc<dyn AnalyzerPlugin>) -> &mut Self {
68 self.analyzer_plugins.push(plugin);
69 self
70 }
71 pub fn add_analyzer_plugin<T: AnalyzerPlugin + Default + 'static>(&mut self) -> &mut Self {
73 self.add_analyzer_plugin_ex(Arc::new(T::default()))
74 }
75 pub fn add(&mut self, suite: PluginSuite) -> &mut Self {
77 self.plugins.extend(suite.plugins);
78 self.inline_macro_plugins.extend(suite.inline_macro_plugins);
79 self.analyzer_plugins.extend(suite.analyzer_plugins);
80 self
81 }
82}
83
84#[derive(Clone, Debug)]
87pub struct InternedPluginSuite {
88 pub macro_plugins: Arc<[MacroPluginId]>,
89 pub inline_macro_plugins: Arc<OrderedHashMap<String, InlineMacroExprPluginId>>,
90 pub analyzer_plugins: Arc<[AnalyzerPluginId]>,
91}