diff --git a/core/src/main/java/org/jboss/jandex/AnnotationInstance.java b/core/src/main/java/org/jboss/jandex/AnnotationInstance.java index 57f95ca7..7961f3d2 100644 --- a/core/src/main/java/org/jboss/jandex/AnnotationInstance.java +++ b/core/src/main/java/org/jboss/jandex/AnnotationInstance.java @@ -432,8 +432,7 @@ public String toString() { /** * Returns whether this annotation instance is equal to another instance. * Two annotation instances are equal if their names and values of their members are equal, - * and they share the exact same {@code AnnotationTarget} instance. The latter restriction - * may be softened in future versions. + * and they share the exact same {@code AnnotationTarget} instance. * * @param o the annotation instance to compare to * @return {@code true} if equal, {@code false} if not @@ -463,6 +462,36 @@ public int hashCode() { int result = name.hashCode(); result = 31 * result + Arrays.hashCode(values); + if (target != null) { + switch (target.kind()) { + case CLASS: + result = 31 * result + target.asClass().name().hashCode(); + break; + case METHOD: + result = 31 * result + target.asMethod().declaringClass().name().hashCode(); + result = 31 * result + target.asMethod().name().hashCode(); + break; + case FIELD: + result = 31 * result + target.asField().declaringClass().name().hashCode(); + result = 31 * result + target.asField().name().hashCode(); + break; + case METHOD_PARAMETER: + result = 31 * result + target.asMethodParameter().method().declaringClass().name().hashCode(); + result = 31 * result + target.asMethodParameter().method().name().hashCode(); + result = 31 * result + target.asMethodParameter().position(); + break; + case RECORD_COMPONENT: + result = 31 * result + target.asRecordComponent().declaringClass().name().hashCode(); + result = 31 * result + target.asRecordComponent().name().hashCode(); + break; + case TYPE: + if (target.asType().target() != null) { + result = 31 * result + target.asType().target().name().hashCode(); + } + break; + } + } + return result; }