aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraclement <aclement>2005-10-18 08:21:02 +0000
committeraclement <aclement>2005-10-18 08:21:02 +0000
commit10e5c437ed35106c8b4827718b756b23ff3eddc2 (patch)
tree0a7d6327a5c0e7a13495e5aa84a7f03cd67f0245
parent04fdd0097b8a915fe072aaa1fdae96cb186dd070 (diff)
downloadaspectj-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.java12
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());