diff --git a/jte/src/main/java/gg/jte/compiler/TemplateCompiler.java b/jte/src/main/java/gg/jte/compiler/TemplateCompiler.java index a8f4e1cd..22b29ccb 100644 --- a/jte/src/main/java/gg/jte/compiler/TemplateCompiler.java +++ b/jte/src/main/java/gg/jte/compiler/TemplateCompiler.java @@ -58,7 +58,7 @@ public Template load(String name) { @Override public Template hotReload(String name) { - LinkedHashSet classDefinitions = generate(Collections.singletonList(name), true); + LinkedHashSet classDefinitions = generate(Collections.singletonList(name), true, readModuleInformation("", codeResolver)); classDefinitions.removeIf(c -> !c.isChanged()); if (!classDefinitions.isEmpty()) { @@ -85,18 +85,24 @@ public void cleanAll() { @Override public List generateAll() { - LinkedHashSet classDefinitions = generate(codeResolver.resolveAllTemplateNames(), false); + Module module = readModuleInformation("", codeResolver); + Collection names = module.resolveAllTemplateNames(); + LinkedHashSet classDefinitions = generate(names, false, module); + return classDefinitions.stream().map(ClassDefinition::getSourceFileName).collect(Collectors.toList()); } @Override public List precompileAll() { - LinkedHashSet classDefinitions = generate(codeResolver.resolveAllTemplateNames(), false); + Module module = readModuleInformation("", codeResolver); + Collection names = module.resolveAllTemplateNames(); + LinkedHashSet classDefinitions = generate(names, false, module); + return precompileClasses(classDefinitions); } public List precompile(List names) { - LinkedHashSet classDefinitions = generate(names, false); + LinkedHashSet classDefinitions = generate(names, false, readModuleInformation("", codeResolver)); return precompileClasses(classDefinitions); } @@ -167,8 +173,7 @@ ClassCompiler createCompiler(String extension) { } } - private LinkedHashSet generate(List names, boolean trackChanges ) { - Module module = readModuleInformation("", codeResolver); + private LinkedHashSet generate(Collection names, boolean trackChanges, Module module) { LinkedHashSet classDefinitions = new LinkedHashSet<>(); for (String name : names) { @@ -234,11 +239,11 @@ private LinkedHashSet generate(List names, boolean trac private Module readModuleInformation(String alias, CodeResolver codeResolver) { String jteRootContent = codeResolver.resolve(".jteroot"); if (jteRootContent == null) { - return new Module(alias, codeResolver, Map.of()); + return new Module(alias, codeResolver, Map.of(), false); } if (!(codeResolver instanceof DirectoryCodeResolver directoryCodeResolver)) { - return new Module(alias, codeResolver, Map.of()); + return new Module(alias, codeResolver, Map.of(), false); } ModuleInfo moduleInfo = ModuleInfoParser.parse(jteRootContent); @@ -250,7 +255,7 @@ private Module readModuleInformation(String alias, CodeResolver codeResolver) { children.put(moduleImport.alias(), readModuleInformation(moduleImport.alias(), moduleDirectoryResolver)); } - return new Module(alias, codeResolver, children); + return new Module(alias, codeResolver, children, moduleInfo.parent()); } private LinkedHashSet initTemplateDependencies(String name) { diff --git a/jte/src/main/java/gg/jte/compiler/module/Module.java b/jte/src/main/java/gg/jte/compiler/module/Module.java index 0ca20feb..fab89f68 100644 --- a/jte/src/main/java/gg/jte/compiler/module/Module.java +++ b/jte/src/main/java/gg/jte/compiler/module/Module.java @@ -1,5 +1,8 @@ package gg.jte.compiler.module; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.List; import java.util.Map; import gg.jte.CodeResolver; @@ -19,11 +22,13 @@ public static String getModuleAlias(String name) { private final String alias; private final CodeResolver codeResolver; private final Map children; + private final boolean parent; - public Module( String alias, CodeResolver codeResolver, Map children ) { + public Module( String alias, CodeResolver codeResolver, Map children, boolean parent ) { this.alias = alias; this.codeResolver = isRoot() ? codeResolver : new ModuleCodeResolver(alias, codeResolver); this.children = children; + this.parent = parent; } public Module resolve(String name) { @@ -60,11 +65,26 @@ public boolean isRoot() { return alias.isEmpty(); } - public String getAlias() { - return alias; - } - public CodeResolver getCodeResolver() { return codeResolver; } + + public Collection resolveAllTemplateNames() { + LinkedHashSet result = new LinkedHashSet<>(); + resolveAllTemplateNames(result); + return result; + } + + private void resolveAllTemplateNames(LinkedHashSet result) { + if (!parent) { + List names = codeResolver.resolveAllTemplateNames(); + for (String name : names) { + result.add(normalize(name)); + } + } + + for (Module module : children.values()) { + module.resolveAllTemplateNames(result); + } + } } diff --git a/jte/src/main/java/gg/jte/compiler/module/ModuleCodeResolver.java b/jte/src/main/java/gg/jte/compiler/module/ModuleCodeResolver.java index a8e88f5e..0f267b7e 100644 --- a/jte/src/main/java/gg/jte/compiler/module/ModuleCodeResolver.java +++ b/jte/src/main/java/gg/jte/compiler/module/ModuleCodeResolver.java @@ -3,6 +3,8 @@ import gg.jte.CodeResolver; import gg.jte.TemplateNotFoundException; +import java.util.List; + public class ModuleCodeResolver implements CodeResolver { @@ -29,6 +31,11 @@ public long getLastModified( String name ) { return codeResolver.getLastModified(removeAlias(name)); } + @Override + public List resolveAllTemplateNames() { + return codeResolver.resolveAllTemplateNames(); + } + @Override public boolean exists( String name ) { return codeResolver.exists(removeAlias(name)); diff --git a/jte/src/main/java/gg/jte/compiler/module/ModuleInfo.java b/jte/src/main/java/gg/jte/compiler/module/ModuleInfo.java index 4d82fe1e..204667fc 100644 --- a/jte/src/main/java/gg/jte/compiler/module/ModuleInfo.java +++ b/jte/src/main/java/gg/jte/compiler/module/ModuleInfo.java @@ -3,4 +3,4 @@ import java.util.List; -public record ModuleInfo(List imports) {} +public record ModuleInfo(boolean parent, List imports) {} diff --git a/jte/src/main/java/gg/jte/compiler/module/ModuleInfoParser.java b/jte/src/main/java/gg/jte/compiler/module/ModuleInfoParser.java index 1efd5e27..c73cb880 100644 --- a/jte/src/main/java/gg/jte/compiler/module/ModuleInfoParser.java +++ b/jte/src/main/java/gg/jte/compiler/module/ModuleInfoParser.java @@ -3,6 +3,7 @@ import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; +import java.util.List; public class ModuleInfoParser { @@ -29,7 +30,8 @@ private ModuleInfoParser( String moduleInfo ) { } private ModuleInfo parse() { - ModuleInfo result = new ModuleInfo(new ArrayList<>()); + boolean parent = false; + List imports = new ArrayList<>(); push(Mode.Root); @@ -44,13 +46,16 @@ private ModuleInfo parse() { importMode.alias = extractFromLastIndex(-4).trim(); } else if ( currentChar == '\n' || i == endIndex - 1) { importMode.from = extractFromLastIndex(1).trim(); - result.imports().add(new ModuleImport(importMode.alias, importMode.from)); + imports.add(new ModuleImport(importMode.alias, importMode.from)); pop(); } + } else if (currentMode == Mode.Root && regionMatches("@parent")) { + parent = true; + lastIndex = i + 1; } } - return result; + return new ModuleInfo(parent, imports); } private String extractFromLastIndex(int offset) { diff --git a/jte/src/test/java/gg/jte/TemplateEngine_ModulesTest.java b/jte/src/test/java/gg/jte/TemplateEngine_ModulesTest.java index 753ecad3..135f5268 100644 --- a/jte/src/test/java/gg/jte/TemplateEngine_ModulesTest.java +++ b/jte/src/test/java/gg/jte/TemplateEngine_ModulesTest.java @@ -72,7 +72,7 @@

line chart (checkout)

} @Test - void emptyTopLevelModule_generateAll() { + void generateAll_emptyTopLevelModule() { DirectoryCodeResolver codeResolver = new DirectoryCodeResolver(Path.of("src/test/modules/empty-top-level-module")); TemplateEngine templateEngine = TemplateEngine.create(codeResolver, ContentType.Html); @@ -87,5 +87,32 @@ void emptyTopLevelModule_generateAll() { ); } - // TODO adjust precompileAll() and generateAll() to iterate over all module files as well! + @Test + void generateAll_threeModulesSameAlias() { + DirectoryCodeResolver codeResolver = new DirectoryCodeResolver(Path.of("src/test/modules/three-modules-same-alias/app")); + TemplateEngine templateEngine = TemplateEngine.create(codeResolver, ContentType.Html); + + List templates = templateEngine.generateAll(); + + assertThat(templates).containsExactlyInAnyOrder( + "gg/jte/generated/ondemand/JtepageGenerated.java", + "gg/jte/generated/ondemand/core/JtelayoutGenerated.java", + "gg/jte/generated/ondemand/apexcharts/JtelinechartGenerated.java" + ); + } + + @Test + void generateAll_threeModulesDifferentAlias() { + DirectoryCodeResolver codeResolver = new DirectoryCodeResolver(Path.of("src/test/modules/three-modules-different-alias/app")); + TemplateEngine templateEngine = TemplateEngine.create(codeResolver, ContentType.Html); + + List templates = templateEngine.generateAll(); + + assertThat(templates).containsExactlyInAnyOrder( + "gg/jte/generated/ondemand/JtepageGenerated.java", + "gg/jte/generated/ondemand/core/JtelayoutGenerated.java", + "gg/jte/generated/ondemand/apexcharts/JtelinechartGenerated.java", + "gg/jte/generated/ondemand/charts/JtelinechartGenerated.java" + ); + } } diff --git a/jte/src/test/modules/empty-top-level-module/.jteroot b/jte/src/test/modules/empty-top-level-module/.jteroot index d65d1049..13384d4b 100644 --- a/jte/src/test/modules/empty-top-level-module/.jteroot +++ b/jte/src/test/modules/empty-top-level-module/.jteroot @@ -1,3 +1,4 @@ +@parent @import apexcharts from apexcharts @import checkout from checkout @import core from core \ No newline at end of file