ligen_utils/transformers/
alias.rs

1use ligen_ir::{Import, Module, Library};
2use crate::transformers::Transform;
3use crate::visitors::{ImportVisitor, ModuleVisitor, LibraryVisitor};
4
5// FIXME: Move this to ligen-rust.
6pub struct ReplaceCrateAlias;
7
8// FIXME: This logic is duplicated fro other transformers. This could be somehow generalized.
9
10impl Transform<Library, Library> for ReplaceCrateAlias {
11    fn transform(&self, data: &Library) -> Library {
12        let visitor = LibraryVisitor::from(data.clone());
13        <Self as Transform::<LibraryVisitor, Library>>::transform(self, &visitor)
14    }
15}
16
17impl Transform<LibraryVisitor, Library> for ReplaceCrateAlias {
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 ReplaceCrateAlias {
27    fn transform(&self, data: &ModuleVisitor) -> Module {
28        let mut module = data.current.clone();
29        for (index, import) in data.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, child_module) in data.modules.iter().enumerate() {
34            let visitor = ModuleVisitor::from(&data.child(child_module.clone()));
35            module.modules[index] = <Self as Transform::<ModuleVisitor, Module>>::transform(self, &visitor);
36        }
37        module
38    }
39}
40
41impl Transform<ImportVisitor, Import> for ReplaceCrateAlias {
42    fn transform(&self, data: &ImportVisitor) -> Import {
43        let mut import = data.current.clone();
44        let first = import.path.first_mut();
45        if *first == "crate".into() {
46            *first = data.parent_library().root_module.identifier.clone().into();
47        }
48        import
49    }
50}