diff --git a/build.gradle b/build.gradle index b203c9f..8baab13 100644 --- a/build.gradle +++ b/build.gradle @@ -188,7 +188,9 @@ afterEvaluate { sourceSets { testmod { + compileClasspath += main.output compileClasspath += main.compileClasspath + runtimeClasspath += main.output runtimeClasspath += main.runtimeClasspath } test { @@ -239,5 +241,13 @@ publishing { } } } +//todo: remove before pr'ing +import net.fabricmc.loom.task.RunClientTask + +task runTestMod(type: RunClientTask) { + classpath = configurations.runtimeClasspath + classpath sourceSets.main.output + classpath sourceSets.testmod.output +} tasks.publish.dependsOn build //stupid fix for maven/loom not publishing the main artifact \ No newline at end of file diff --git a/omega-config-base/src/main/java/draylar/omegaconfig/OmegaConfig.java b/omega-config-base/src/main/java/draylar/omegaconfig/OmegaConfig.java index 40a5bfe..3097e00 100644 --- a/omega-config-base/src/main/java/draylar/omegaconfig/OmegaConfig.java +++ b/omega-config-base/src/main/java/draylar/omegaconfig/OmegaConfig.java @@ -23,7 +23,12 @@ import java.lang.reflect.InvocationTargetException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; public class OmegaConfig { @@ -109,10 +114,9 @@ public class OmegaConfig { addFieldComments(field, keyToComments); } - // get inner-class fields - // TODO: recursively get inner classes? - for (Class innerClass : configClass.getDeclaredClasses()) { - for (Field field : innerClass.getDeclaredFields()) { + // "flattens" all the inner classes of the Config class into a single list + for (Class clazz : flatten(configClass.getDeclaredClasses())) { + for (Field field : clazz.getDeclaredFields()) { addFieldComments(field, keyToComments); } } @@ -154,6 +158,32 @@ public class OmegaConfig { } } + private static List> flatten(Class[] array) { + List> list = new ArrayList<>(); + + if (array.length <= 0) { + return list; + } + + for (Class clazz : array) { + populateRecursively(list, clazz); + } + + return list; + } + + private static void populateRecursively(List> list, Class aClass) { + list.add(aClass); + + Class[] classes = aClass.getDeclaredClasses(); + + if (classes.length != 0) { + for (Class clazz : classes) { + populateRecursively(list, clazz); + } + } + } + private static void addFieldComments(Field field, Map keyToComments) { String fieldName = field.getName(); Annotation[] annotations = field.getDeclaredAnnotations(); diff --git a/src/testmod/java/draylar/omegatest/OmegaTestMain.java b/src/testmod/java/draylar/omegatest/OmegaTestMain.java index 26a2546..4c767c5 100644 --- a/src/testmod/java/draylar/omegatest/OmegaTestMain.java +++ b/src/testmod/java/draylar/omegatest/OmegaTestMain.java @@ -2,6 +2,7 @@ package draylar.omegatest; import draylar.omegaconfig.OmegaConfig; import draylar.omegatest.config.ClassConfigTest; +import draylar.omegatest.config.CommentedNestedClassConfig; import draylar.omegatest.config.NestedConfigTest; import draylar.omegatest.config.SimpleConfigTest; import draylar.omegatest.config.StructuresConfigTest; @@ -13,6 +14,7 @@ public class OmegaTestMain implements ModInitializer { public static final StructuresConfigTest MO_CONFIG = OmegaConfig.register(StructuresConfigTest.class); public static final NestedConfigTest NESTED = OmegaConfig.register(NestedConfigTest.class); public static final ClassConfigTest CLASS = OmegaConfig.register(ClassConfigTest.class); + public static final CommentedNestedClassConfig COMMENTED_NESTED_CLASS = OmegaConfig.register(CommentedNestedClassConfig.class); @Override public void onInitialize() { diff --git a/src/testmod/java/draylar/omegatest/config/CommentedNestedClassConfig.java b/src/testmod/java/draylar/omegatest/config/CommentedNestedClassConfig.java new file mode 100644 index 0000000..28c62e5 --- /dev/null +++ b/src/testmod/java/draylar/omegatest/config/CommentedNestedClassConfig.java @@ -0,0 +1,73 @@ +package draylar.omegatest.config; + +import draylar.omegaconfig.api.Comment; +import draylar.omegaconfig.api.Config; + +public class CommentedNestedClassConfig implements Config { + + @Comment("Very nested test") + public First first = new First(); + + @Comment("True") + public boolean test = false; + + @Comment("First-Level") + public VeryNested veryNested = new VeryNested(); + + public static class First { + @Comment("Cucumbers") + public boolean cucumbers = true; + + @Comment("InnerFirst") + public InnerFirst innerFirst = new InnerFirst(); + + @Comment("InnerSecond") + public InnerSecond innerSecond = new InnerSecond(); + + public static class InnerFirst { + @Comment("Number of Tomatoes") + public int numberOfTomatoes = 10; + } + + public static class InnerSecond { + @Comment("Inner Second First") + public InnerSecondFirst innerSecondFirst = new InnerSecondFirst(); + + public static class InnerSecondFirst { + @Comment("Olive Oil") + public String oliveOil = "oliveOil"; + } + } + } + + public static class VeryNested { + @Comment("Second-Level") + public Very very = new Very(); + public static class Very { + @Comment("Third-Level") + public VeryVery veryVery = new VeryVery(); + public static class VeryVery { + @Comment("Forth-Level") + public VeryVeryVery veryVeryVery = new VeryVeryVery(); + public static class VeryVeryVery { + @Comment("Fifth-Level") + public VeryVeryVeryVery veryVeryVeryVery = new VeryVeryVeryVery(); + public static class VeryVeryVeryVery { + @Comment("Sixth-Level") + public String last = "last"; + } + } + } + } + } + + @Override + public String getName() { + return "commented-inner-classes"; + } + + @Override + public String getExtension() { + return "json5"; + } +}