Переглянути джерело

Implemented @ConfigEntryContainer.Transitive

Lortseam 5 роки тому
батько
коміт
32a2b58213

+ 0 - 1
build.gradle

@@ -20,7 +20,6 @@ dependencies {
 
 	compileOnly "org.projectlombok:lombok:${project.lombok_version}"
 	annotationProcessor "org.projectlombok:lombok:${project.lombok_version}"
-	compileOnly "org.jetbrains:annotations:${project.jetbrains_annotations_version}"
 }
 
 processResources {

+ 1 - 2
gradle.properties

@@ -16,5 +16,4 @@ org.gradle.jvmargs=-Xmx1G
 	# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
 	fabric_version=0.5.1+build.294-1.15
 	cloth_config_version=2.11.2
-	lombok_version=1.18.12
-	jetbrains_annotations_version=19.0.0
+	lombok_version=1.18.12

+ 42 - 10
src/main/java/me/lortseam/completeconfig/ConfigManager.java

@@ -22,7 +22,10 @@ import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
 import me.shedaniel.clothconfig2.impl.builders.SubCategoryBuilder;
 import net.fabricmc.loader.api.FabricLoader;
 import net.minecraft.client.gui.screen.Screen;
+import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import java.io.*;
 import java.lang.reflect.Modifier;
@@ -92,8 +95,15 @@ public class ConfigManager {
                 }
             });
             LinkedHashMap<String, Entry> clazzEntries = new LinkedHashMap<>();
-            //TODO: Warnung in der Konsole anzeigen, wenn Container POJO ist (isConfigPOJO() == true) aber trotzdem ein Feld mit @ConfigEntry annotiert ist, oder wenn Container kein POJO ist und Feld mit @ConfigEntry.Ignore annotiert ist
-            Arrays.stream(clazz.getDeclaredFields()).filter(field -> !Modifier.isStatic(field.getModifiers()) && (container.isConfigPOJO() && !field.isAnnotationPresent(ConfigEntry.Ignore.class) || field.isAnnotationPresent(ConfigEntry.class))).forEach(field -> {
+            Arrays.stream(clazz.getDeclaredFields()).filter(field -> {
+                if (Modifier.isStatic(field.getModifiers()) || field.isAnnotationPresent(ConfigEntryContainer.Transitive.class)) {
+                    return false;
+                }
+                if (container.isConfigPOJO()) {
+                    return !field.isAnnotationPresent(ConfigEntry.Ignore.class);
+                }
+                return field.isAnnotationPresent(ConfigEntry.class);
+            }).forEach(field -> {
                 if (!field.isAccessible()) {
                     field.setAccessible(true);
                 }
@@ -184,15 +194,37 @@ public class ConfigManager {
             throw new RuntimeException("An instance of " + container.getClass() + " is already registered!");
         }
         collection.getEntries().putAll(getContainerEntries(container));
-        ConfigEntryContainer[] containers = container.getTransitiveConfigEntryContainers();
-        if (containers != null) {
-            for (ConfigEntryContainer c : containers) {
-                if (c instanceof ConfigCategory) {
-                    registerCategory(collection.getCollections(), (ConfigCategory) c, false);
-                } else {
-                    registerContainer(collection, c);
-                    collection.getEntries().putAll(getContainerEntries(c));
+        ConfigEntryContainer[] containers = ArrayUtils.addAll(Arrays.stream(container.getClass().getDeclaredFields()).filter(field -> {
+            if (Modifier.isStatic(field.getModifiers())) {
+                return false;
+            }
+            if (container.isConfigPOJO()) {
+                return ConfigEntryContainer.class.isAssignableFrom(field.getType());
+            } else {
+                if (field.isAnnotationPresent(ConfigEntryContainer.Transitive.class)) {
+                    if (!ConfigEntryContainer.class.isAssignableFrom(field.getType())) {
+                        throw new RuntimeException("@ConfigEntryContainer.Transitive is not applicable on field type " + field.getType());
+                    }
+                    return true;
                 }
+                return false;
+            }
+        }).map(field -> {
+            if (!field.isAccessible()) {
+                field.setAccessible(true);
+            }
+            try {
+                return field.get(container);
+            } catch (IllegalAccessException e) {
+                throw new RuntimeException(e);
+            }
+        }).toArray(ConfigEntryContainer[]::new), Objects.requireNonNull(container.getTransitiveConfigEntryContainers()));
+        for (ConfigEntryContainer c : containers) {
+            if (c instanceof ConfigCategory) {
+                registerCategory(collection.getCollections(), (ConfigCategory) c, false);
+            } else {
+                registerContainer(collection, c);
+                collection.getEntries().putAll(getContainerEntries(c));
             }
         }
     }

+ 1 - 2
src/main/java/me/lortseam/completeconfig/api/ConfigCategory.java

@@ -1,11 +1,10 @@
 package me.lortseam.completeconfig.api;
 
 import com.google.common.base.CaseFormat;
-import org.jetbrains.annotations.NotNull;
 
 public interface ConfigCategory extends ConfigEntryContainer {
 
-    default @NotNull String getConfigCategoryID() {
+    default String getConfigCategoryID() {
         return CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, getClass().getSimpleName());
     }
 

+ 1 - 2
src/main/java/me/lortseam/completeconfig/api/ConfigEntryContainer.java

@@ -8,14 +8,13 @@ import java.lang.annotation.Target;
 public interface ConfigEntryContainer {
 
     default ConfigEntryContainer[] getTransitiveConfigEntryContainers() {
-        return null;
+        return new ConfigEntryContainer[0];
     }
 
     default boolean isConfigPOJO() {
         return false;
     }
 
-    //TODO: Implement
     @Target(ElementType.FIELD)
     @Retention(RetentionPolicy.RUNTIME)
     @interface Transitive {