ligen_utils/transformers/
path.rs1use 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 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}