### Eclipse Workspace Patch 1.0 #P weaver Index: src/org/aspectj/weaver/bcel/BcelClassWeaver.java =================================================================== RCS file: /cvsroot/tools/org.aspectj/modules/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java,v retrieving revision 1.106 diff -u -r1.106 BcelClassWeaver.java --- src/org/aspectj/weaver/bcel/BcelClassWeaver.java 12 May 2009 17:47:48 -0000 1.106 +++ src/org/aspectj/weaver/bcel/BcelClassWeaver.java 11 Jun 2009 20:31:51 -0000 @@ -79,6 +79,7 @@ import org.aspectj.weaver.Shadow; import org.aspectj.weaver.ShadowMunger; import org.aspectj.weaver.UnresolvedType; +import org.aspectj.weaver.UnresolvedTypeVariableReferenceType; import org.aspectj.weaver.WeaverMessages; import org.aspectj.weaver.WeaverStateInfo; import org.aspectj.weaver.World; @@ -584,9 +585,17 @@ // Look at erasures of parameters (List erased is List) boolean sameParams = true; for (int p = 0; p < methodThatMightBeGettingOverridden.getParameterTypes().length; p++) { - if (!methodThatMightBeGettingOverridden.getParameterTypes()[p].getErasureSignature().equals( - methodParamsArray[p].getErasureSignature())) + UnresolvedType ut = methodThatMightBeGettingOverridden.getParameterTypes()[p]; + if (ut instanceof UnresolvedTypeVariableReferenceType) { + ut = ((UnresolvedTypeVariableReferenceType) ut).getTypeVariable().getFirstBound(); + } + UnresolvedType ut2 = methodParamsArray[p]; + if (!ut.resolve(typeToCheck.getWorld()).isAssignableFrom(ut2.resolve(typeToCheck.getWorld()))) { sameParams = false; + } + // + // if (!ut.getErasureSignature().equals(ut2.getErasureSignature())) + // sameParams = false; } // If the 'typeToCheck' represents a parameterized type then the method @@ -601,9 +610,7 @@ if (sameParams) { // check for covariance - if (typeToCheck.isParameterizedType()) { - return methodThatMightBeGettingOverridden.getBackingGenericMember(); - } else if (!methodThatMightBeGettingOverridden.getReturnType().getErasureSignature().equals(mrettype)) { + if (!methodThatMightBeGettingOverridden.getReturnType().getErasureSignature().equals(mrettype)) { // addressing the wierd situation from bug 147801 // just check whether these things are in the right relationship // for covariance... @@ -612,6 +619,10 @@ ResolvedType subReturn = typeToCheck.getWorld().resolve(UnresolvedType.forSignature(mrettype)); if (superReturn.isAssignableFrom(subReturn)) return methodThatMightBeGettingOverridden; + } else if (typeToCheck.isParameterizedType()) { + return methodThatMightBeGettingOverridden.getBackingGenericMember(); + } else { + return methodThatMightBeGettingOverridden; } } return null; @@ -651,7 +662,6 @@ return null; if (typeToCheck instanceof MissingResolvedTypeWithKnownSignature) return null; // we just can't tell ! - if (typeToCheck.getWorld().forDEBUG_bridgingCode) System.err.println(" Bridging:checking for override of " + mname + " in " + typeToCheck); @@ -676,7 +686,7 @@ if (isOverriding != null) return isOverriding; } - List l = typeToCheck.getInterTypeMungers(); + List l = (typeToCheck.isRawType() ? typeToCheck.getGenericType().getInterTypeMungers() : typeToCheck.getInterTypeMungers()); for (Iterator iterator = l.iterator(); iterator.hasNext();) { Object o = iterator.next(); // FIXME asc if its not a BcelTypeMunger then its an