--- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Tue May 14 13:55:35 2013 -0700
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Tue May 14 15:04:06 2013 -0700
@@ -26,7 +26,6 @@
package com.sun.tools.javac.code;
import java.lang.ref.SoftReference;
-import java.util.Comparator;
import java.util.HashSet;
import java.util.HashMap;
import java.util.Locale;
@@ -34,8 +33,6 @@
import java.util.Set;
import java.util.WeakHashMap;
-import javax.lang.model.type.TypeKind;
-
import com.sun.tools.javac.code.Attribute.RetentionPolicy;
import com.sun.tools.javac.code.Lint.LintCategory;
import com.sun.tools.javac.code.Type.UndetVar.InferenceBound;
@@ -204,7 +201,7 @@
WildcardType unb = new WildcardType(syms.objectType,
BoundKind.UNBOUND,
syms.boundClass,
- (TypeVar)parms.head);
+ (TypeVar)parms.head.unannotatedType());
if (!containsType(args.head, unb))
return false;
parms = parms.tail;
@@ -268,7 +265,7 @@
List<Type> opens = openVars.toList();
ListBuffer<Type> qs = new ListBuffer<Type>();
for (List<Type> iter = opens; iter.nonEmpty(); iter = iter.tail) {
- qs.append(new WildcardType(syms.objectType, BoundKind.UNBOUND, syms.boundClass, (TypeVar) iter.head));
+ qs.append(new WildcardType(syms.objectType, BoundKind.UNBOUND, syms.boundClass, (TypeVar) iter.head.unannotatedType()));
}
res = subst(res, opens, qs.toList());
}
@@ -581,12 +578,12 @@
//simply replace the wildcards with its bound
for (Type t : formalInterface.getTypeArguments()) {
if (actualTypeargs.head.hasTag(WILDCARD)) {
- WildcardType wt = (WildcardType)actualTypeargs.head;
+ WildcardType wt = (WildcardType)actualTypeargs.head.unannotatedType();
Type bound;
switch (wt.kind) {
case EXTENDS:
case UNBOUND:
- CapturedType capVar = (CapturedType)capturedTypeargs.head;
+ CapturedType capVar = (CapturedType)capturedTypeargs.head.unannotatedType();
//use declared bound if it doesn't depend on formal type-args
bound = capVar.bound.containsAny(capturedSite.getTypeArguments()) ?
wt.type : capVar.bound;
@@ -964,6 +961,9 @@
isSameTypeStrict.visit(t, s) :
isSameTypeLoose.visit(t, s);
}
+ public boolean isSameAnnotatedType(Type t, Type s) {
+ return isSameAnnotatedType.visit(t, s);
+ }
// where
abstract class SameTypeVisitor extends TypeRelation {
@@ -982,7 +982,7 @@
if (s.tag == TYPEVAR) {
//type-substitution does not preserve type-var types
//check that type var symbols and bounds are indeed the same
- return sameTypeVars((TypeVar)t, (TypeVar)s);
+ return sameTypeVars((TypeVar)t.unannotatedType(), (TypeVar)s.unannotatedType());
}
else {
//special case for s == ? super X, where upper(s) = u
@@ -1096,7 +1096,9 @@
* Standard type-equality relation - type variables are considered
* equals if they share the same type symbol.
*/
- TypeRelation isSameTypeLoose = new SameTypeVisitor() {
+ TypeRelation isSameTypeLoose = new LooseSameTypeVisitor();
+
+ private class LooseSameTypeVisitor extends SameTypeVisitor {
@Override
boolean sameTypeVars(TypeVar tv1, TypeVar tv2) {
return tv1.tsym == tv2.tsym && visit(tv1.getUpperBound(), tv2.getUpperBound());
@@ -1126,12 +1128,29 @@
if (!s.hasTag(WILDCARD)) {
return false;
} else {
- WildcardType t2 = (WildcardType)s;
+ WildcardType t2 = (WildcardType)s.unannotatedType();
return t.kind == t2.kind &&
isSameType(t.type, t2.type, true);
}
}
};
+
+ /**
+ * A version of LooseSameTypeVisitor that takes AnnotatedTypes
+ * into account.
+ */
+ TypeRelation isSameAnnotatedType = new LooseSameTypeVisitor() {
+ @Override
+ public Boolean visitAnnotatedType(AnnotatedType t, Type s) {
+ if (!s.isAnnotated())
+ return false;
+ if (!t.getAnnotationMirrors().containsAll(s.getAnnotationMirrors()))
+ return false;
+ if (!s.getAnnotationMirrors().containsAll(t.getAnnotationMirrors()))
+ return false;
+ return visit(t.underlyingType, s);
+ }
+ };
// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="Contains Type">
@@ -1140,7 +1159,7 @@
case UNDETVAR:
if (s.tag == WILDCARD) {
UndetVar undetvar = (UndetVar)t;
- WildcardType wt = (WildcardType)s;
+ WildcardType wt = (WildcardType)s.unannotatedType();
switch(wt.kind) {
case UNBOUND: //similar to ? extends Object
case EXTENDS: {
@@ -1207,7 +1226,7 @@
private Type U(Type t) {
while (t.tag == WILDCARD) {
- WildcardType w = (WildcardType)t;
+ WildcardType w = (WildcardType)t.unannotatedType();
if (w.isSuperBound())
return w.bound == null ? syms.objectType : w.bound.bound;
else
@@ -1218,7 +1237,7 @@
private Type L(Type t) {
while (t.tag == WILDCARD) {
- WildcardType w = (WildcardType)t;
+ WildcardType w = (WildcardType)t.unannotatedType();
if (w.isExtendsBound())
return syms.botType;
else
@@ -1276,15 +1295,15 @@
};
public boolean isCaptureOf(Type s, WildcardType t) {
- if (s.tag != TYPEVAR || !((TypeVar)s).isCaptured())
+ if (s.tag != TYPEVAR || !((TypeVar)s.unannotatedType()).isCaptured())
return false;
- return isSameWildcard(t, ((CapturedType)s).wildcard);
+ return isSameWildcard(t, ((CapturedType)s.unannotatedType()).wildcard);
}
public boolean isSameWildcard(WildcardType t, Type s) {
if (s.tag != WILDCARD)
return false;
- WildcardType w = (WildcardType)s;
+ WildcardType w = (WildcardType)s.unannotatedType();
return w.kind == t.kind && w.type == t.type;
}
@@ -1373,8 +1392,8 @@
if (t.isCompound() || s.isCompound()) {
return !t.isCompound() ?
- visitIntersectionType((IntersectionClassType)s, t, true) :
- visitIntersectionType((IntersectionClassType)t, s, false);
+ visitIntersectionType((IntersectionClassType)s.unannotatedType(), t, true) :
+ visitIntersectionType((IntersectionClassType)t.unannotatedType(), s, false);
}
if (s.tag == CLASS || s.tag == ARRAY) {
@@ -3070,7 +3089,7 @@
for (Type t : tvars) {
if (!first) s.append(", ");
first = false;
- appendTyparamString(((TypeVar)t), s);
+ appendTyparamString(((TypeVar)t.unannotatedType()), s);
}
s.append('>');
return s.toString();
@@ -3710,9 +3729,9 @@
!currentS.isEmpty()) {
if (currentS.head != currentT.head) {
captured = true;
- WildcardType Ti = (WildcardType)currentT.head;
+ WildcardType Ti = (WildcardType)currentT.head.unannotatedType();
Type Ui = currentA.head.getUpperBound();
- CapturedType Si = (CapturedType)currentS.head;
+ CapturedType Si = (CapturedType)currentS.head.unannotatedType();
if (Ui == null)
Ui = syms.objectType;
switch (Ti.kind) {
@@ -3749,6 +3768,7 @@
ListBuffer<Type> result = lb();
for (Type t : types) {
if (t.tag == WILDCARD) {
+ t = t.unannotatedType();
Type bound = ((WildcardType)t).getExtendsBound();
if (bound == null)
bound = syms.objectType;
@@ -3842,7 +3862,7 @@
private boolean giveWarning(Type from, Type to) {
List<Type> bounds = to.isCompound() ?
- ((IntersectionClassType)to).getComponents() : List.of(to);
+ ((IntersectionClassType)to.unannotatedType()).getComponents() : List.of(to);
for (Type b : bounds) {
Type subFrom = asSub(from, b.tsym);
if (b.isParameterized() &&
@@ -4107,7 +4127,7 @@
Type B(Type t) {
while (t.tag == WILDCARD) {
- WildcardType w = (WildcardType)t;
+ WildcardType w = (WildcardType)t.unannotatedType();
t = high ?
w.getExtendsBound() :
w.getSuperBound();
@@ -4182,7 +4202,7 @@
public boolean equals(Object obj) {
return (obj instanceof UniqueType) &&
- types.isSameType(type, ((UniqueType)obj).type);
+ types.isSameAnnotatedType(type, ((UniqueType)obj).type);
}
public String toString() {