ligen_core/generator/
file_generator.rs

1//! File generator module.
2
3use crate::generator::{FileSet, Context, ImplementationVisitor, FunctionVisitor, ParameterVisitor, FileProcessorVisitor};
4use crate::ir::ImplementationItem;
5
6/// File generator.
7pub trait FileGenerator {
8    /// Generate files.
9    fn generate_files(&self, context: &Context, file_set: &mut FileSet, visitor: Option<&ImplementationVisitor>);
10}
11
12/// File generator with visitors.
13pub trait FileGeneratorVisitors {
14    /// Implementation processor.
15    type ImplementationProcessor: FileProcessorVisitor<Visitor = ImplementationVisitor>;
16
17    /// Function processor.
18    type FunctionProcessor: FileProcessorVisitor<Visitor = FunctionVisitor>;
19
20    /// Parameter processor.
21    type ParameterProcessor: FileProcessorVisitor<Visitor = ParameterVisitor>;
22}
23
24impl<T: FileGeneratorVisitors> FileGenerator for T {
25    fn generate_files(&self, context: &Context, file_set: &mut FileSet, visitor: Option<&ImplementationVisitor>) {
26        if let Some(visitor) = visitor {
27            let implementation_processor = T::ImplementationProcessor::default();
28            let function_processor = T::FunctionProcessor::default();
29            let parameter_processor = T::ParameterProcessor::default();
30            implementation_processor.process(context, file_set, visitor);
31            for item in &visitor.current.items {
32                if let ImplementationItem::Method(function) = item {
33                    let visitor = visitor.child(function.clone());
34                    function_processor.process(context, file_set, &visitor);
35                    for (index, parameter) in function.inputs.iter().enumerate() {
36                        let visitor = visitor.child(parameter.clone());
37                        parameter_processor.process(context, file_set, &visitor);
38                        if index != function.inputs.len() - 1 {
39                            parameter_processor.post_process(context, file_set, &visitor);
40                        }
41                    }
42                    function_processor.post_process(context, file_set, &visitor);
43                }
44            }
45            implementation_processor.post_process(context, file_set, visitor);
46        }
47    }
48}