diff --git a/src/main/java/org/jboss/jandex/ArrayType.java b/src/main/java/org/jboss/jandex/ArrayType.java index 6a461145..a577060f 100644 --- a/src/main/java/org/jboss/jandex/ArrayType.java +++ b/src/main/java/org/jboss/jandex/ArrayType.java @@ -21,8 +21,9 @@ * @author Jason T. Greene */ public final class ArrayType extends Type { - private Type component; - private int dimensions; + private final Type component; + private final int dimensions; + private int hash; ArrayType(Type component, int dimensions) { super(null); @@ -30,11 +31,6 @@ public final class ArrayType extends Type { this.component = component; } - public ArrayType(DotName name) { - // FIXME parse; - super(name); - } - public Type component() { return component; } @@ -70,4 +66,29 @@ public String toString() { public Kind kind() { return Kind.ARRAY; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (! (o instanceof ArrayType)) { + return false; + } + ArrayType arrayType = (ArrayType) o; + + return dimensions == arrayType.dimensions && component.equals(arrayType.component); + } + + @Override + public int hashCode() { + int hash = this.hash; + if (hash != 0) { + return hash; + } + hash = component.hashCode(); + hash = 31 * hash + dimensions; + return this.hash = hash; + } } diff --git a/src/main/java/org/jboss/jandex/DotName.java b/src/main/java/org/jboss/jandex/DotName.java index f614a28e..41488976 100644 --- a/src/main/java/org/jboss/jandex/DotName.java +++ b/src/main/java/org/jboss/jandex/DotName.java @@ -173,7 +173,7 @@ public String toString(char delim) { public int hashCode() { int hash = this.hash; - if (hash > 0) + if (hash != 0) return hash; if (prefix != null) { diff --git a/src/main/java/org/jboss/jandex/ParameterizedType.java b/src/main/java/org/jboss/jandex/ParameterizedType.java index 862d6ed7..9afe0a33 100644 --- a/src/main/java/org/jboss/jandex/ParameterizedType.java +++ b/src/main/java/org/jboss/jandex/ParameterizedType.java @@ -17,12 +17,15 @@ */ package org.jboss.jandex; +import java.util.Arrays; + /** * @author Jason T. Greene */ public class ParameterizedType extends Type { - private Type[] parameters; - private Type owner; + private final Type[] parameters; + private final Type owner; + private int hash; ParameterizedType(DotName name, Type[] parameters, Type owner) { super(name); @@ -64,4 +67,31 @@ public String toString() { return builder.toString(); } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (!super.equals(o)) { + return false; + } + + ParameterizedType other = (ParameterizedType) o; + return owner.equals(other.owner) && Arrays.equals(parameters, other.parameters); + } + + @Override + public int hashCode() { + int hash = this.hash; + if (hash != 0) { + return hash; + } + + hash = super.hashCode(); + hash = 31 * hash + Arrays.hashCode(parameters); + hash = 31 * hash + owner.hashCode(); + return this.hash = hash; + } } diff --git a/src/main/java/org/jboss/jandex/Type.java b/src/main/java/org/jboss/jandex/Type.java index 7f30caef..ff18115a 100644 --- a/src/main/java/org/jboss/jandex/Type.java +++ b/src/main/java/org/jboss/jandex/Type.java @@ -153,6 +153,26 @@ public DotName name() { public abstract Kind kind(); public String toString() { - return name().toString(); + return name.toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + Type type = (Type) o; + + return name.equals(type.name); + } + + @Override + public int hashCode() { + return name.hashCode(); } } diff --git a/src/main/java/org/jboss/jandex/TypeVariable.java b/src/main/java/org/jboss/jandex/TypeVariable.java index 632dc2e9..9a1634ec 100644 --- a/src/main/java/org/jboss/jandex/TypeVariable.java +++ b/src/main/java/org/jboss/jandex/TypeVariable.java @@ -17,12 +17,15 @@ */ package org.jboss.jandex; +import java.util.Arrays; + /** * @author Jason T. Greene */ -public class TypeVariable extends Type { - private String name; - private Type[] bounds; +public final class TypeVariable extends Type { + private final String name; + private final Type[] bounds; + private int hash; TypeVariable(String name) { this(name, EMPTY_ARRAY); @@ -63,4 +66,33 @@ public String toString() { return builder.toString(); } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (!super.equals(o)) { + return false; + } + + TypeVariable that = (TypeVariable) o; + + return name.equals(that.name) && Arrays.equals(bounds, that.bounds); + + } + + @Override + public int hashCode() { + int hash = this.hash; + if (hash != 0) { + return hash; + } + + hash = super.hashCode(); + hash = 31 * hash + name.hashCode(); + hash = 31 * hash + Arrays.hashCode(bounds); + return this.hash = hash; + } } diff --git a/src/main/java/org/jboss/jandex/WildcardType.java b/src/main/java/org/jboss/jandex/WildcardType.java index 9e6999c0..ad83cfb1 100644 --- a/src/main/java/org/jboss/jandex/WildcardType.java +++ b/src/main/java/org/jboss/jandex/WildcardType.java @@ -23,8 +23,9 @@ public class WildcardType extends Type { private static Type OBJECT = new ClassType(DotName.OBJECT_NAME); - private Type bound; - private boolean isExtends; + private final boolean isExtends; + private final Type bound; + private int hash; WildcardType(Type bound, boolean isExtends) { super(isExtends && bound != null ? bound.name() : DotName.OBJECT_NAME); @@ -60,4 +61,30 @@ public String toString() { return builder.toString(); } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!super.equals(o)) { + return false; + } + + WildcardType other = (WildcardType) o; + return isExtends == other.isExtends && bound.equals(other.bound); + } + + @Override + public int hashCode() { + int hash = this.hash; + if (hash != 0) { + return hash; + } + + hash = super.hashCode(); + hash = 31 * hash + (isExtends ? 1 : 0); + hash = 31 * hash + bound.hashCode(); + return this.hash = hash; + } }