From e1892944ff978f8ca8b5fddf8d7f8085cc9c975f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bendeg=C3=BAz=20Nagy?= Date: Mon, 28 Aug 2017 13:59:30 +0200 Subject: [PATCH] Java, typeres: make java type definition lower bound into a subclass --- .../typedefinition/JavaTypeDefinition.java | 3 +- .../JavaTypeDefinitionLower.java | 20 +++++++++++ .../JavaTypeDefinitionSpecial.java | 36 ++++++------------- 3 files changed, 32 insertions(+), 27 deletions(-) create mode 100644 pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/typedefinition/JavaTypeDefinitionLower.java diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/typedefinition/JavaTypeDefinition.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/typedefinition/JavaTypeDefinition.java index 0db5a4f95e..93c6964d09 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/typedefinition/JavaTypeDefinition.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/typedefinition/JavaTypeDefinition.java @@ -37,8 +37,9 @@ public abstract class JavaTypeDefinition implements TypeDefinition { } case UPPER_BOUND: case UPPER_WILDCARD: - case LOWER_WILDCARD: return new JavaTypeDefinitionSpecial(type, intersectionTypes); + case LOWER_WILDCARD: + return new JavaTypeDefinitionLower(intersectionTypes); default: throw new IllegalStateException("Unknow type"); } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/typedefinition/JavaTypeDefinitionLower.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/typedefinition/JavaTypeDefinitionLower.java new file mode 100644 index 0000000000..a8aaddc915 --- /dev/null +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/typedefinition/JavaTypeDefinitionLower.java @@ -0,0 +1,20 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.java.typeresolution.typedefinition; + +import static net.sourceforge.pmd.lang.java.typeresolution.typedefinition.TypeDefinitionType.LOWER_WILDCARD; + +/* default */ class JavaTypeDefinitionLower extends JavaTypeDefinitionSpecial { + private static final JavaTypeDefinition OBJECT_DEFINITION = forClass(Object.class); + + protected JavaTypeDefinitionLower(JavaTypeDefinition... typeList) { + super(LOWER_WILDCARD, typeList); + } + + @Override + protected JavaTypeDefinition firstJavaType() { + return OBJECT_DEFINITION; + } +} diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/typedefinition/JavaTypeDefinitionSpecial.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/typedefinition/JavaTypeDefinitionSpecial.java index 3f8009b393..f233205ca7 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/typedefinition/JavaTypeDefinitionSpecial.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/typeresolution/typedefinition/JavaTypeDefinitionSpecial.java @@ -20,14 +20,7 @@ import java.util.Set; throw new IllegalArgumentException("Intersection type list can't be empty"); } - // this is to preserve compatibility, lower bounds are really just Objects - if (defType == TypeDefinitionType.LOWER_WILDCARD) { - this.typeList = new JavaTypeDefinition[typeList.length + 1]; - this.typeList[0] = forClass(Object.class); - System.arraycopy(typeList, 0, this.typeList, 1, typeList.length); - } else { - this.typeList = typeList; - } + this.typeList = typeList; } @@ -35,7 +28,7 @@ import java.util.Set; * All the calls to this method are to delegate JavaTypeDefinition method calls to the first * JavaTypeDefinition in the 'typeList' list. */ - private JavaTypeDefinition firstJavaType() { + protected JavaTypeDefinition firstJavaType() { return typeList[0]; } @@ -130,14 +123,14 @@ import java.util.Set; @Override public boolean equals(Object obj) { - if (obj == null || !(obj instanceof JavaTypeDefinitionSpecial)) { - return false; - } - if (this == obj) { return true; } + if (obj == null || !this.getClass().isInstance(obj)) { + return false; + } + JavaTypeDefinitionSpecial otherTypeDef = (JavaTypeDefinitionSpecial) obj; if (otherTypeDef.getJavaTypeCount() != getJavaTypeCount() @@ -203,22 +196,13 @@ import java.util.Set; @Override public boolean isRawType() { - if (isLowerBound()) { - // The reason for this is that with lower bounds, there is always a dummy Object.class at typeList[0] - // This is to be able to delegate to it. - return typeList.length == 2 && typeList[1].isRawType(); - } else { - return typeList.length == 1 && firstJavaType().isRawType(); - } + // with lower bounds the second part would always eval true, + // because with lower bounds firstJavaType is Object.class + return typeList.length == 1 && firstJavaType().isRawType(); } @Override public boolean isIntersectionType() { - if (isLowerBound()) { - // with lower bound types, there is always a dummy Object.class at typeList[0] - return typeList.length > 2; - } else { - return typeList.length > 1; - } + return typeList.length > 1; } }