cairo_lang_semantic/
plugin.rs1use std::sync::Arc;
2
3use cairo_lang_defs::ids::ModuleId;
4use cairo_lang_defs::plugin::{InlineMacroExprPlugin, MacroPlugin, NamedPlugin, PluginDiagnostic};
5use cairo_lang_utils::ordered_hash_map::OrderedHashMap;
6
7use crate::db::SemanticGroup;
8
9pub trait AnalyzerPlugin: std::fmt::Debug + Sync + Send {
12 fn diagnostics(&self, db: &dyn SemanticGroup, module_id: ModuleId) -> Vec<PluginDiagnostic>;
14 fn declared_allows(&self) -> Vec<String> {
20 Vec::new()
21 }
22}
23
24#[derive(Clone, Debug, Default)]
26pub struct PluginSuite {
27 pub plugins: Vec<Arc<dyn MacroPlugin>>,
29 pub inline_macro_plugins: OrderedHashMap<String, Arc<dyn InlineMacroExprPlugin>>,
31 pub analyzer_plugins: Vec<Arc<dyn AnalyzerPlugin>>,
33}
34impl PluginSuite {
35 pub fn add_plugin_ex(&mut self, plugin: Arc<dyn MacroPlugin>) -> &mut Self {
37 self.plugins.push(plugin);
38 self
39 }
40 pub fn add_plugin<T: MacroPlugin + Default + 'static>(&mut self) -> &mut Self {
42 self.add_plugin_ex(Arc::new(T::default()))
43 }
44 pub fn add_inline_macro_plugin_ex(
46 &mut self,
47 name: &str,
48 plugin: Arc<dyn InlineMacroExprPlugin>,
49 ) -> &mut Self {
50 self.inline_macro_plugins.insert(name.into(), plugin);
51 self
52 }
53 pub fn add_inline_macro_plugin<T: NamedPlugin + InlineMacroExprPlugin>(&mut self) -> &mut Self {
55 self.add_inline_macro_plugin_ex(T::NAME, Arc::new(T::default()));
56 self
57 }
58 pub fn add_analyzer_plugin_ex(&mut self, plugin: Arc<dyn AnalyzerPlugin>) -> &mut Self {
60 self.analyzer_plugins.push(plugin);
61 self
62 }
63 pub fn add_analyzer_plugin<T: AnalyzerPlugin + Default + 'static>(&mut self) -> &mut Self {
65 self.add_analyzer_plugin_ex(Arc::new(T::default()))
66 }
67 pub fn add(&mut self, suite: PluginSuite) -> &mut Self {
69 self.plugins.extend(suite.plugins);
70 self.inline_macro_plugins.extend(suite.inline_macro_plugins);
71 self.analyzer_plugins.extend(suite.analyzer_plugins);
72 self
73 }
74}