ligen_core/generator/
file_generator.rs1use crate::generator::{FileSet, Context, ImplementationVisitor, FunctionVisitor, ParameterVisitor, FileProcessorVisitor};
4use crate::ir::ImplementationItem;
5
6pub trait FileGenerator {
8 fn generate_files(&self, context: &Context, file_set: &mut FileSet, visitor: Option<&ImplementationVisitor>);
10}
11
12pub trait FileGeneratorVisitors {
14 type ImplementationProcessor: FileProcessorVisitor<Visitor = ImplementationVisitor>;
16
17 type FunctionProcessor: FileProcessorVisitor<Visitor = FunctionVisitor>;
19
20 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}