diff -r 0384683c64be -r ddb4a2bfcd82 src/share/classes/com/sun/tools/javac/code/Types.java --- a/src/share/classes/com/sun/tools/javac/code/Types.java Tue May 14 13:55:35 2013 -0700 +++ b/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 opens = openVars.toList(); ListBuffer qs = new ListBuffer(); for (List 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); + } + }; // // @@ -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 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 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() {