ligen_utils/transformers/
path.rs

1use ligen_ir::{Function, Import, Module, Library, Type};
2use crate::transformers::Transform;
3use crate::visitors::{FunctionVisitor, ImportVisitor, ModuleVisitor, LibraryVisitor};
4
5pub struct RelativePathToAbsolutePath;
6
7impl Transform<Library, Library> for RelativePathToAbsolutePath {
8    fn transform(&self, data: &Library) -> Library {
9        let data = data.clone();
10        // TODO: We need to review this process.
11        // data.root_module.guarantee_absolute_paths();
12        let visitor = LibraryVisitor::from(data);
13        <Self as Transform<LibraryVisitor, Library>>::transform(self, &visitor)
14    }
15}
16
17impl Transform<LibraryVisitor, Library> for RelativePathToAbsolutePath {
18    fn transform(&self, data: &LibraryVisitor) -> Library {
19        let mut library = data.current.clone();
20        let visitor = ModuleVisitor::from(&data.child(data.current.root_module.clone()));
21        library.root_module = <Self as Transform::<ModuleVisitor, Module>>::transform(self, &visitor);
22        library
23    }
24}
25
26impl Transform<ModuleVisitor, Module> for RelativePathToAbsolutePath {
27    fn transform(&self, data: &ModuleVisitor) -> Module {
28        let mut module = data.current.clone();
29        for (index, import) in data.current.imports.iter().enumerate() {
30            let visitor = data.child(import.clone());
31            module.imports[index] = <Self as Transform::<ImportVisitor, Import>>::transform(self, &visitor);
32        }
33        for (index, function) in data.current.functions.iter().enumerate() {
34            let visitor = data.child(function.clone());
35            module.functions[index] = <Self as Transform::<FunctionVisitor, Function>>::transform(self, &visitor);
36        }
37        for (index, child_module) in data.current.modules.iter().enumerate() {
38            let visitor = ModuleVisitor::from(&data.child(child_module.clone()));
39            module.modules[index] = <Self as Transform::<ModuleVisitor, Module>>::transform(self, &visitor);
40        }
41        module
42    }
43}
44
45impl Transform<ImportVisitor, Import> for RelativePathToAbsolutePath {
46    fn transform(&self, data: &ImportVisitor) -> Import {
47        let mut import = data.current.clone();
48        if let Some(absolute_path) = data.find_absolute_path() {
49            import.path = absolute_path;
50        }
51        import
52    }
53}
54
55impl Transform<FunctionVisitor, Function> for RelativePathToAbsolutePath {
56    fn transform(&self, data: &FunctionVisitor) -> Function {
57        let mut function = data.current.clone();
58        if let Some(output) = function.output.as_mut() {
59            type_to_absolute_path(&data.parent, output);
60        }
61        for input in &mut function.inputs {
62            type_to_absolute_path(&data.parent, &mut input.type_);
63        }
64        function
65    }
66}
67
68fn type_to_absolute_path(module_visitor: &ModuleVisitor, type_: &mut Type) {
69    let path = &mut type_.path;
70    if let Some(absolute_path) = module_visitor.find_absolute_path(path) {
71        *path = absolute_path
72    }
73}