From 5508ea26ea41d53fa4028ced83384f2fd0688cdd Mon Sep 17 00:00:00 2001 From: bigguy345 Date: Sun, 21 Dec 2025 19:24:26 +0200 Subject: [PATCH] Dynamically changed color of imported class/type declarations depending on its type (class/enum/interface) --- .../gui/util/script/JavaTextContainer.java | 60 +++++++++++++++++-- 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/src/main/java/noppes/npcs/client/gui/util/script/JavaTextContainer.java b/src/main/java/noppes/npcs/client/gui/util/script/JavaTextContainer.java index 8887d0ba8..d26f334d0 100644 --- a/src/main/java/noppes/npcs/client/gui/util/script/JavaTextContainer.java +++ b/src/main/java/noppes/npcs/client/gui/util/script/JavaTextContainer.java @@ -95,6 +95,7 @@ public class JavaTextContainer extends TextContainer { private List localFields = new ArrayList<>(); private java.util.Map importedClasses = new java.util.HashMap<>(); // simpleName -> fullName private java.util.Set importedPackages = new java.util.HashSet<>(); // wildcard imports + private java.util.Map classTypeCache = new java.util.HashMap<>(); // fullClassName -> TokenType (cached reflection results) // Common java.lang classes (auto-imported) private static final java.util.Set JAVA_LANG_CLASSES = new java.util.HashSet<>(java.util.Arrays.asList( @@ -130,6 +131,38 @@ public class JavaTextContainer extends TextContainer { } } + /** + * Determine the token type for a class using reflection. + * Returns INTERFACE_DECL for interfaces, ENUM_DECL for enums, or the defaultType for classes/unknown. + */ + private TokenType getClassTokenType(String fullClassName, TokenType defaultType) { + if (fullClassName == null || fullClassName.isEmpty()) return defaultType; + + // Check cache first + if (classTypeCache.containsKey(fullClassName)) { + return classTypeCache.get(fullClassName); + } + + TokenType result = defaultType; + try { + Class clazz = Class.forName(fullClassName); + if (clazz.isInterface()) { + result = TokenType.INTERFACE_DECL; + } else if (clazz.isEnum()) { + result = TokenType.ENUM_DECL; + } else { + result = defaultType; // regular class + } + } catch (Exception e) { + // Class not found or can't be loaded - use default + result = defaultType; + } + + // Cache the result + classTypeCache.put(fullClassName, result); + return result; + } + private void collectFields() { globalFields.clear(); localFields.clear(); @@ -404,11 +437,13 @@ public class JavaTextContainer extends TextContainer { int pkgEnd = pathStart + lastDot; // +1 includes . marks.add(new Mark(pathStart, pkgEnd + 1, TokenType.TYPE_DECL)); // dark blue - // class part (e.g., "ArrayList") - marks.add(new Mark(pkgEnd + 1, pathEnd, TokenType.IMPORTED_CLASS)); // aqua + // class part (e.g., "ArrayList") - determine type dynamically + TokenType classTokenType = getClassTokenType(fullPath, TokenType.IMPORTED_CLASS); + marks.add(new Mark(pkgEnd + 1, pathEnd, classTokenType)); } else { // No package, just class name - marks.add(new Mark(pathStart, pathEnd, TokenType.IMPORTED_CLASS)); + TokenType classTokenType = getClassTokenType(fullPath, TokenType.IMPORTED_CLASS); + marks.add(new Mark(pathStart, pathEnd, classTokenType)); } // Highlight .* if present (find '*' between match bounds) @@ -452,7 +487,13 @@ public class JavaTextContainer extends TextContainer { } if (isImported && !isShadowed) { - marks.add(new Mark(start, end, TokenType.IMPORTED_CLASS)); + // Determine token type dynamically using reflection + String fullClassName = importedClasses.get(className); + if (fullClassName == null && JAVA_LANG_CLASSES.contains(className)) { + fullClassName = "java.lang." + className; + } + TokenType tokenType = getClassTokenType(fullClassName, TokenType.IMPORTED_CLASS); + marks.add(new Mark(start, end, tokenType)); } } } @@ -579,7 +620,14 @@ public class JavaTextContainer extends TextContainer { if (g1s < r[1] && g1e > r[0]) { skip = true; break; } } if (skip) continue; - marks.add(new Mark(g1s, g1e, TokenType.TYPE_DECL)); + // Check if this type is a known interface or enum using reflection + String typeName = m.group(1); + String fullClassName = importedClasses.get(typeName); + if (fullClassName == null && JAVA_LANG_CLASSES.contains(typeName)) { + fullClassName = "java.lang." + typeName; + } + TokenType tokenType = getClassTokenType(fullClassName, TokenType.TYPE_DECL); + marks.add(new Mark(g1s, g1e, tokenType)); if (m.group(2) != null) { int start = lineStart + m.start(2); @@ -590,7 +638,7 @@ public class JavaTextContainer extends TextContainer { // Inner type: String in if (m.group(3) != null) { - marks.add(new Mark(lineStart + m.start(3), lineStart + m.end(3), TokenType.NEW_TYPE)); + marks.add(new Mark(lineStart + m.start(3), lineStart + m.end(3), TokenType.IMPORTED_CLASS)); } } }