use std::any::Any;
use std::ops::Deref;
use std::sync::Arc;
use cairo_lang_diagnostics::Severity;
use cairo_lang_filesystem::ids::CodeMapping;
use cairo_lang_syntax::node::ast;
use cairo_lang_syntax::node::db::SyntaxGroup;
use cairo_lang_syntax::node::ids::SyntaxStablePtrId;
use smol_str::SmolStr;
pub trait GeneratedFileAuxData: std::fmt::Debug + Sync + Send {
fn as_any(&self) -> &dyn Any;
fn eq(&self, other: &dyn GeneratedFileAuxData) -> bool;
}
#[derive(Clone, Debug)]
pub struct DynGeneratedFileAuxData(pub Arc<dyn GeneratedFileAuxData>);
impl DynGeneratedFileAuxData {
pub fn new<T: GeneratedFileAuxData + 'static>(aux_data: T) -> Self {
DynGeneratedFileAuxData(Arc::new(aux_data))
}
}
impl Deref for DynGeneratedFileAuxData {
type Target = Arc<dyn GeneratedFileAuxData>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl PartialEq for DynGeneratedFileAuxData {
fn eq(&self, that: &DynGeneratedFileAuxData) -> bool {
GeneratedFileAuxData::eq(&*self.0, &*that.0)
}
}
impl Eq for DynGeneratedFileAuxData {}
pub struct PluginGeneratedFile {
pub name: SmolStr,
pub content: String,
pub code_mappings: Vec<CodeMapping>,
pub aux_data: Option<DynGeneratedFileAuxData>,
}
#[derive(Default)]
pub struct PluginResult {
pub code: Option<PluginGeneratedFile>,
pub diagnostics: Vec<PluginDiagnostic>,
pub remove_original_item: bool,
}
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub struct PluginDiagnostic {
pub stable_ptr: SyntaxStablePtrId,
pub message: String,
pub severity: Severity,
}
impl PluginDiagnostic {
pub fn error(stable_ptr: SyntaxStablePtrId, message: String) -> PluginDiagnostic {
PluginDiagnostic { stable_ptr, message, severity: Severity::Error }
}
pub fn warning(stable_ptr: SyntaxStablePtrId, message: String) -> PluginDiagnostic {
PluginDiagnostic { stable_ptr, message, severity: Severity::Warning }
}
}
pub trait MacroPlugin: std::fmt::Debug + Sync + Send {
fn generate_code(&self, db: &dyn SyntaxGroup, item_ast: ast::ModuleItem) -> PluginResult;
fn declared_attributes(&self) -> Vec<String>;
}
#[derive(Default)]
pub struct InlinePluginResult {
pub code: Option<PluginGeneratedFile>,
pub diagnostics: Vec<PluginDiagnostic>,
}
pub trait InlineMacroExprPlugin: std::fmt::Debug + Sync + Send {
fn generate_code(
&self,
db: &dyn SyntaxGroup,
item_ast: &ast::ExprInlineMacro,
) -> InlinePluginResult;
}
pub trait NamedPlugin: Default + 'static {
const NAME: &'static str;
}