1use tracing::warn;
2
3use kodept_ast::graph::{AnyNode, ChangeSet};
4use kodept_ast::utils::Execution;
5use kodept_ast::utils::Execution::Skipped;
6use kodept_ast::visit_side::VisitGuard;
7
8use crate::error::report::ReportMessage;
9use crate::traits::Context;
10
11pub mod default;
12pub mod erased;
13pub mod error;
14pub mod traits;
15
16pub fn warn_about_broken_rlt<T>() {
17 warn!(
18 expected = std::any::type_name::<T>(),
19 "Skipping some checks because node in RLT either doesn't exist or has different type."
20 );
21}
22
23pub trait Macro {
24 type Error: Into<ReportMessage>;
25 type Node: TryFrom<AnyNode>;
26
27 #[allow(unused_variables)]
28 fn transform(
29 &mut self,
30 guard: VisitGuard<Self::Node>,
31 context: &mut impl Context,
32 ) -> Execution<Self::Error, ChangeSet> {
33 Skipped
34 }
35}
36
37impl<M: Macro> Macro for &mut M {
38 type Error = M::Error;
39 type Node = M::Node;
40
41 fn transform(
42 &mut self,
43 guard: VisitGuard<Self::Node>,
44 context: &mut impl Context,
45 ) -> Execution<Self::Error, ChangeSet> {
46 M::transform(self, guard, context)
47 }
48}