1 package net.florianschoppmann.java.reflect; 2 3 import javax.annotation.Nullable; 4 import javax.lang.model.type.DeclaredType; 5 import javax.lang.model.type.TypeKind; 6 import javax.lang.model.type.TypeVisitor; 7 import java.util.List; 8 import java.util.Objects; 9 10 final class DeclaredTypeImpl extends AnnotatedConstructImpl implements ReflectionTypeMirror, DeclaredType { 11 private final ReflectionTypeMirror enclosingType; 12 private final TypeElementImpl typeElement; 13 private final ImmutableList<? extends ReflectionTypeMirror> typeArguments; 14 15 DeclaredTypeImpl(ReflectionTypeMirror enclosingType, TypeElementImpl typeElement, 16 List<? extends ReflectionTypeMirror> typeArguments) { 17 Objects.requireNonNull(enclosingType); 18 Objects.requireNonNull(typeElement); 19 Objects.requireNonNull(typeArguments); 20 21 this.enclosingType = enclosingType; 22 this.typeElement = typeElement; 23 this.typeArguments = ImmutableList.copyOf(typeArguments); 24 } 25 26 @Override 27 public boolean equals(@Nullable Object otherObject) { 28 if (this == otherObject) { 29 return true; 30 } else if (otherObject == null || getClass() != otherObject.getClass()) { 31 return false; 32 } 33 34 DeclaredTypeImpl other = (DeclaredTypeImpl) otherObject; 35 return enclosingType.equals(other.enclosingType) 36 && typeElement.equals(other.typeElement) 37 && typeArguments.equals(other.typeArguments); 38 } 39 40 @Override 41 public int hashCode() { 42 return Objects.hash(enclosingType, typeElement, typeArguments); 43 } 44 45 @Override 46 public String toString() { 47 return ReflectionTypes.getInstance().toString(this); 48 } 49 50 @Override 51 public <R, P> R accept(TypeVisitor<R, P> visitor, @Nullable P parameter) { 52 return visitor.visitDeclared(this, parameter); 53 } 54 55 @Override 56 public TypeElementImpl asElement() { 57 return typeElement; 58 } 59 60 @Override 61 public ReflectionTypeMirror getEnclosingType() { 62 return enclosingType; 63 } 64 65 @Override 66 public List<? extends ReflectionTypeMirror> getTypeArguments() { 67 return typeArguments; 68 } 69 70 @Override 71 public TypeKind getKind() { 72 return TypeKind.DECLARED; 73 } 74 }