From d9c5ee6661785381d2b128a44ca00738e8d52d66 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Fri, 26 Feb 2021 15:44:15 +0100 Subject: [PATCH] config: Handle sections and titles when using inheritance --- .../runelite/client/config/ConfigManager.java | 34 +++++++++++++++---- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java index fb6c6b05d0..4bb471b57f 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java @@ -41,6 +41,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; +import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Proxy; @@ -591,7 +592,7 @@ public class ConfigManager throw new IllegalArgumentException("Not a config group"); } - final List sections = Arrays.stream(inter.getDeclaredFields()) + final List sections = getAllDeclaredInterfaceFields(inter).stream() .filter(m -> m.isAnnotationPresent(ConfigSection.class) && m.getType() == String.class) .map(m -> { @@ -615,7 +616,7 @@ public class ConfigManager .result()) .collect(Collectors.toList()); - final List titles = Arrays.stream(inter.getDeclaredFields()) + final List titles = getAllDeclaredInterfaceFields(inter).stream() .filter(m -> m.isAnnotationPresent(ConfigTitle.class) && m.getType() == String.class) .map(m -> { @@ -924,20 +925,39 @@ public class ConfigManager return object == null ? null : object.toString(); } + /** + * Does DFS on a class's interfaces to find all of its implemented fields. + */ + private Collection getAllDeclaredInterfaceFields(Class clazz) + { + Collection methods = new HashSet<>(); + Stack> interfaces = new Stack<>(); + interfaces.push(clazz); + + while (!interfaces.isEmpty()) + { + Class interfaze = interfaces.pop(); + Collections.addAll(methods, interfaze.getDeclaredFields()); + Collections.addAll(interfaces, interfaze.getInterfaces()); + } + + return methods; + } + /** * Does DFS on a class's interfaces to find all of its implemented methods. */ private Collection getAllDeclaredInterfaceMethods(Class clazz) { Collection methods = new HashSet<>(); - Stack> interfazes = new Stack<>(); - interfazes.push(clazz); + Stack> interfaces = new Stack<>(); + interfaces.push(clazz); - while (!interfazes.isEmpty()) + while (!interfaces.isEmpty()) { - Class interfaze = interfazes.pop(); + Class interfaze = interfaces.pop(); Collections.addAll(methods, interfaze.getDeclaredMethods()); - Collections.addAll(interfazes, interfaze.getInterfaces()); + Collections.addAll(interfaces, interfaze.getInterfaces()); } return methods;