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;
7use salsa::Database;
8
9use crate::ids::AnalyzerPluginId;
10
11pub trait AnalyzerPlugin: std::fmt::Debug + Sync + Send + Any {
14 fn diagnostics<'db>(
16 &self,
17 db: &'db dyn Database,
18 module_id: ModuleId<'db>,
19 ) -> Vec<PluginDiagnostic<'db>>;
20 fn declared_allows(&self) -> Vec<String> {
26 Vec::new()
27 }
28
29 fn plugin_type_id(&self) -> any::TypeId {
32 self.type_id()
33 }
34}
35
36#[derive(Clone, Debug, Default)]
38pub struct PluginSuite {
39 pub plugins: Vec<Arc<dyn MacroPlugin>>,
41 pub inline_macro_plugins: OrderedHashMap<String, Arc<dyn InlineMacroExprPlugin>>,
43 pub analyzer_plugins: Vec<Arc<dyn AnalyzerPlugin>>,
45}
46impl PluginSuite {
47 pub fn add_plugin_ex(&mut self, plugin: Arc<dyn MacroPlugin>) -> &mut Self {
49 self.plugins.push(plugin);
50 self
51 }
52 pub fn add_plugin<T: MacroPlugin + Default + 'static>(&mut self) -> &mut Self {
54 self.add_plugin_ex(Arc::new(T::default()))
55 }
56 pub fn add_inline_macro_plugin_ex(
58 &mut self,
59 name: &str,
60 plugin: Arc<dyn InlineMacroExprPlugin>,
61 ) -> &mut Self {
62 self.inline_macro_plugins.insert(name.into(), plugin);
63 self
64 }
65 pub fn add_inline_macro_plugin<T: NamedPlugin + InlineMacroExprPlugin>(&mut self) -> &mut Self {
67 self.add_inline_macro_plugin_ex(T::NAME, Arc::new(T::default()));
68 self
69 }
70 pub fn add_analyzer_plugin_ex(&mut self, plugin: Arc<dyn AnalyzerPlugin>) -> &mut Self {
72 self.analyzer_plugins.push(plugin);
73 self
74 }
75 pub fn add_analyzer_plugin<T: AnalyzerPlugin + Default + 'static>(&mut self) -> &mut Self {
77 self.add_analyzer_plugin_ex(Arc::new(T::default()))
78 }
79 pub fn add(&mut self, suite: PluginSuite) -> &mut Self {
81 self.plugins.extend(suite.plugins);
82 self.inline_macro_plugins.extend(suite.inline_macro_plugins);
83 self.analyzer_plugins.extend(suite.analyzer_plugins);
84 self
85 }
86}
87
88#[derive(Clone, Debug)]
91pub struct InternedPluginSuite<'db> {
92 pub macro_plugins: Arc<[MacroPluginId<'db>]>,
93 pub inline_macro_plugins: Arc<OrderedHashMap<String, InlineMacroExprPluginId<'db>>>,
94 pub analyzer_plugins: Arc<[AnalyzerPluginId<'db>]>,
95}