diff options
author | aclement <aclement> | 2005-10-18 08:21:02 +0000 |
---|---|---|
committer | aclement <aclement> | 2005-10-18 08:21:02 +0000 |
commit | 10e5c437ed35106c8b4827718b756b23ff3eddc2 (patch) | |
tree | 0a7d6327a5c0e7a13495e5aa84a7f03cd67f0245 | |
parent | 04fdd0097b8a915fe072aaa1fdae96cb186dd070 (diff) | |
download | aspectj-10e5c437ed35106c8b4827718b756b23ff3eddc2.tar.gz aspectj-10e5c437ed35106c8b4827718b756b23ff3eddc2.zip |
see pr112105: parameterizes a generic ITD when looking at whether abstract methods are overridden.
-rw-r--r-- | weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java b/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java index c0474a376..c340f2925 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java @@ -44,6 +44,7 @@ import org.aspectj.weaver.AsmRelationshipProvider; import org.aspectj.weaver.BCException; import org.aspectj.weaver.ConcreteTypeMunger; import org.aspectj.weaver.Member; +import org.aspectj.weaver.MethodDelegateTypeMunger; import org.aspectj.weaver.NameMangler; import org.aspectj.weaver.NewConstructorTypeMunger; import org.aspectj.weaver.NewFieldTypeMunger; @@ -59,9 +60,7 @@ import org.aspectj.weaver.TypeVariableReference; import org.aspectj.weaver.UnresolvedType; import org.aspectj.weaver.WeaverMessages; import org.aspectj.weaver.WeaverStateInfo; -import org.aspectj.weaver.MethodDelegateTypeMunger; import org.aspectj.weaver.World; -import org.aspectj.weaver.ReferenceType; import org.aspectj.weaver.patterns.DeclareAnnotation; import org.aspectj.weaver.patterns.Pointcut; @@ -239,6 +238,14 @@ public class BcelTypeMunger extends ConcreteTypeMunger { if (m.getMunger().getKind() == ResolvedTypeMunger.Method) { ResolvedMember sig = m.getSignature(); if (!Modifier.isAbstract(sig.getModifiers())) { + + // If the ITD shares a type variable with some target type, we need to tailor it for that + // type + if (m.isTargetTypeParameterized()) { + ResolvedType genericOnType = getWorld().resolve(sig.getDeclaringType()).getGenericType(); + m = m.parameterizedFor(newParent.discoverActualOccurrenceOfTypeInHierarchy(genericOnType)); + sig = m.getSignature(); // possible sig change when type parameters filled in + } if (ResolvedType .matches( AjcMemberMaker.interMethod( @@ -892,6 +899,7 @@ public class BcelTypeMunger extends ConcreteTypeMunger { private boolean mungeMethodDelegate(BcelClassWeaver weaver, MethodDelegateTypeMunger munger) { ResolvedMember introduced = munger.getSignature(); + LazyClassGen gen = weaver.getLazyClassGen(); ResolvedType fromType = weaver.getWorld().resolve(introduced.getDeclaringType(),munger.getSourceLocation()); |