diff --git a/src/main/java/noppes/npcs/client/gui/util/script/interpreter/hover/TokenHoverInfo.java b/src/main/java/noppes/npcs/client/gui/util/script/interpreter/hover/TokenHoverInfo.java index 567f0a8f7..9bfb9ff3d 100644 --- a/src/main/java/noppes/npcs/client/gui/util/script/interpreter/hover/TokenHoverInfo.java +++ b/src/main/java/noppes/npcs/client/gui/util/script/interpreter/hover/TokenHoverInfo.java @@ -582,7 +582,7 @@ public class TokenHoverInfo { // // Show modifiers from source if we have a declaration position // String modifiers = extractModifiersAtPosition(fieldInfo.getDeclarationOffset()); // if (modifiers != null && !modifiers.isEmpty()) { -// addSegment(modifiers + " ", TokenType.MODIFIER.getHexColor()); +// addSegment(modifiers + " ", TokenType.KEYWORD.getHexColor()); // } // } @@ -802,6 +802,64 @@ public class TokenHoverInfo { } else { addSegment(param.getBoundTypeName(), TokenType.IMPORTED_CLASS.getHexColor()); } + + List additionalBoundTypes = param.getAdditionalBoundTypes(); + List additionalBoundNames = param.getAdditionalBoundNames(); + for (int j = 0; j < additionalBoundNames.size(); j++) { + addSegment(" & ", TokenType.DEFAULT.getHexColor()); + TypeInfo additionalBoundType = j < additionalBoundTypes.size() ? additionalBoundTypes.get(j) : null; + if (additionalBoundType != null && additionalBoundType.isResolved()) { + addTypeSegments(additionalBoundType); + if (!additionalBoundType.isParameterized()) { + addBoundTypeParamSegments(additionalBoundType); + } + } else { + addSegment(additionalBoundNames.get(j), TokenType.IMPORTED_CLASS.getHexColor()); + } + } + } + } + + addSegment(">", TokenType.DEFAULT.getHexColor()); + } + + private void addBoundTypeParamSegments(TypeInfo boundType) { + List params = boundType.getTypeParams(); + if (params == null || params.isEmpty()) return; + + addSegment("<", TokenType.DEFAULT.getHexColor()); + for (int i = 0; i < params.size(); i++) { + if (i > 0) + addSegment(", ", TokenType.DEFAULT.getHexColor()); + TypeParamInfo tp = params.get(i); + addSegment(tp.getName(), TokenType.GENERIC_TYPE_PARAM.getHexColor()); + + if (tp.getBoundTypeName() != null && !"Object".equals(tp.getBoundTypeName())) { + addSegment(" extends ", TokenType.KEYWORD.getHexColor()); + TypeInfo innerBound = tp.getBoundTypeInfo(); + if (innerBound != null && innerBound.isResolved()) { + addTypeSegments(innerBound); + if (!innerBound.isParameterized()) { + addBoundTypeParamSegments(innerBound); + } + } else { + addSegment(tp.getBoundTypeName(), TokenType.IMPORTED_CLASS.getHexColor()); + } + + List innerAdditional = tp.getAdditionalBoundTypes(); + List innerAdditionalNames = tp.getAdditionalBoundNames(); + for (int j = 0; j < innerAdditionalNames.size(); j++) { + addSegment(" & ", TokenType.DEFAULT.getHexColor()); + TypeInfo innerAddBound = j < innerAdditional.size() ? innerAdditional.get(j) : null; + if (innerAddBound != null && innerAddBound.isResolved()) { + addTypeSegments(innerAddBound); + if (!innerAddBound.isParameterized()) { + addBoundTypeParamSegments(innerAddBound); + } + } else { + addSegment(innerAdditionalNames.get(j), TokenType.IMPORTED_CLASS.getHexColor()); + } + } addSegment(" extends ", TokenType.KEYWORD.getHexColor()); } }