Index: src/org/aspectj/weaver/AjcMemberMaker.java =================================================================== RCS file: /home/technology/org.aspectj/modules/weaver/src/org/aspectj/weaver/AjcMemberMaker.java,v retrieving revision 1.15 diff -u -r1.15 AjcMemberMaker.java --- src/org/aspectj/weaver/AjcMemberMaker.java 20 May 2005 12:27:59 -0000 1.15 +++ src/org/aspectj/weaver/AjcMemberMaker.java 6 Jul 2005 14:23:17 -0000 @@ -603,7 +603,7 @@ /** * This method goes on the target type of the inter-type method. (and possibly the topmost-implemeters, - * if the target type is an interface) +- * if the target type is an interface). It calls the interMethodDispatcher on the aspect. */ public static ResolvedMember interMethod(ResolvedMember meth, TypeX aspectType, boolean onInterface) { @@ -621,6 +621,7 @@ /** * This static method goes on the declaring aspect of the inter-type method. + * It calls the interMethodBody. */ public static ResolvedMember interMethodDispatcher(ResolvedMember meth, TypeX aspectType) { @@ -637,6 +638,7 @@ /** * This static method goes on the declaring aspect of the inter-type method. + * It contains the body of the ITD method. */ public static ResolvedMember interMethodBody(ResolvedMember meth, TypeX aspectType) { Index: src/org/aspectj/weaver/NewConstructorTypeMunger.java =================================================================== RCS file: /home/technology/org.aspectj/modules/weaver/src/org/aspectj/weaver/NewConstructorTypeMunger.java,v retrieving revision 1.7 diff -u -r1.7 NewConstructorTypeMunger.java --- src/org/aspectj/weaver/NewConstructorTypeMunger.java 3 Aug 2004 12:35:10 -0000 1.7 +++ src/org/aspectj/weaver/NewConstructorTypeMunger.java 6 Jul 2005 14:23:17 -0000 @@ -38,8 +38,7 @@ } - //XXX horrible name clash here - public ResolvedMember getDispatchMethod(TypeX aspectType) { + public ResolvedMember getInterMethodBody(TypeX aspectType) { return AjcMemberMaker.interMethodBody(signature, aspectType); } Index: src/org/aspectj/weaver/NewMethodTypeMunger.java =================================================================== RCS file: /home/technology/org.aspectj/modules/weaver/src/org/aspectj/weaver/NewMethodTypeMunger.java,v retrieving revision 1.5 diff -u -r1.5 NewMethodTypeMunger.java --- src/org/aspectj/weaver/NewMethodTypeMunger.java 3 Aug 2004 12:35:10 -0000 1.5 +++ src/org/aspectj/weaver/NewMethodTypeMunger.java 6 Jul 2005 14:23:17 -0000 @@ -28,10 +28,13 @@ } - //XXX horrible name clash here - public ResolvedMember getDispatchMethod(TypeX aspectType) { + public ResolvedMember getInterMethodBody(TypeX aspectType) { return AjcMemberMaker.interMethodBody(signature, aspectType); } + + public ResolvedMember getInterMethodDispatcher(TypeX aspectType) { + return AjcMemberMaker.interMethodDispatcher(signature, aspectType); + } public void write(DataOutputStream s) throws IOException { kind.write(s); Index: src/org/aspectj/weaver/bcel/BcelClassWeaver.java =================================================================== RCS file: /home/technology/org.aspectj/modules/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java,v retrieving revision 1.43 diff -u -r1.43 BcelClassWeaver.java --- src/org/aspectj/weaver/bcel/BcelClassWeaver.java 9 Jun 2005 15:57:26 -0000 1.43 +++ src/org/aspectj/weaver/bcel/BcelClassWeaver.java 6 Jul 2005 14:23:18 -0000 @@ -27,9 +27,11 @@ import org.aspectj.apache.bcel.Constants; import org.aspectj.apache.bcel.classfile.Field; +import org.aspectj.apache.bcel.classfile.annotation.Annotation; import org.aspectj.apache.bcel.generic.BranchInstruction; import org.aspectj.apache.bcel.generic.CPInstruction; import org.aspectj.apache.bcel.generic.ConstantPoolGen; +import org.aspectj.apache.bcel.generic.FieldGen; import org.aspectj.apache.bcel.generic.FieldInstruction; import org.aspectj.apache.bcel.generic.INVOKESPECIAL; import org.aspectj.apache.bcel.generic.IndexedInstruction; @@ -49,6 +51,7 @@ import org.aspectj.apache.bcel.generic.ReturnInstruction; import org.aspectj.apache.bcel.generic.Select; import org.aspectj.apache.bcel.generic.Type; +import org.aspectj.apache.bcel.generic.annotation.AnnotationGen; import org.aspectj.bridge.IMessage; import org.aspectj.bridge.ISourceLocation; import org.aspectj.bridge.WeaveMessage; @@ -78,6 +81,8 @@ import org.aspectj.weaver.Shadow.Kind; import org.aspectj.weaver.patterns.DeclareAnnotation; import org.aspectj.weaver.patterns.FastMatchInfo; +import org.aspectj.apache.bcel.classfile.Method; +import org.aspectj.apache.bcel.generic.MethodGen; class BcelClassWeaver implements IClassWeaver { @@ -465,49 +470,58 @@ for (int memberCounter = 0;memberCounter 0) + System.err.println(annotationsOnRealMember[0].getTypeName()); + if (annotationsOnRealMember!=null) { + for (int i = 0; i < annotationsOnRealMember.length; i++) { + AnnotationX annotationX = annotationsOnRealMember[i]; + Annotation a = annotationX.getBcelAnnotation(); + AnnotationGen ag = new AnnotationGen(a,weaver.getLazyClassGen().getConstantPoolGen(),true); + mg.addAnnotation(new AnnotationX(ag.getAnnotation(),weaver.getWorld())); + } + } + } + // the below loop fixes the very special (and very stupid) + // case where an aspect declares an annotation + // on an ITD it declared on itself. + List allDecams = weaver.getWorld().getDeclareAnnotationOnMethods(); + for (Iterator i = allDecams.iterator(); i.hasNext();){ + DeclareAnnotation decaMC = (DeclareAnnotation) i.next(); + if (decaMC.matches(interMethod,weaver.getWorld()) + && mg.getEnclosingClass().getType() == aspectType) { + mg.addAnnotation(decaMC.getAnnotationX()); + } } } - if (!onInterface && !Modifier.isAbstract(introMethod.getModifiers())) { + if (!onInterface && !Modifier.isAbstract(interMethod.getModifiers())) { InstructionList body = mg.getBody(); InstructionFactory fact = gen.getFactory(); int pos = 0; @@ -759,22 +776,21 @@ body.append(InstructionFactory.createThis()); pos++; } - Type[] paramTypes = BcelWorld.makeBcelTypes(introMethod.getParameterTypes()); + Type[] paramTypes = BcelWorld.makeBcelTypes(interMethod.getParameterTypes()); for (int i = 0, len = paramTypes.length; i < len; i++) { Type paramType = paramTypes[i]; body.append(InstructionFactory.createLoad(paramType, pos)); pos+=paramType.getSize(); } - body.append(Utility.createInvoke(fact, weaver.getWorld(), dispatchMethod)); + body.append(Utility.createInvoke(fact, weaver.getWorld(), interMethodBody)); body.append( InstructionFactory.createReturn( - BcelWorld.makeBcelType(introMethod.getReturnType()))); + BcelWorld.makeBcelType(interMethod.getReturnType()))); } else { //??? this is okay //if (!(mg.getBody() == null)) throw new RuntimeException("bas"); } - // XXX make sure to check that we set exceptions properly on this guy. weaver.addLazyMethodGen(mg); weaver.getLazyClassGen().warnOnAddedMethod(mg.getMethod(),getSignature().getSourceLocation()); @@ -824,7 +840,7 @@ body.append(InstructionFactory.createLoad(paramType, pos)); pos+=paramType.getSize(); } - body.append(Utility.createInvoke(fact, weaver.getWorld(), dispatchMethod)); + body.append(Utility.createInvoke(fact, weaver.getWorld(), interMethodBody)); body.append(InstructionFactory.createReturn(returnType)); mg.definingType = onType; @@ -1055,6 +1071,21 @@ return false; } + + ResolvedMember interMethodBody = munger.getInitMethod(aspectType); + + AnnotationX annotationsOnRealMember[] = null; + // pr98901 + // For copying the annotations across, we have to discover the real member in the aspect + // which is holding them. + if (weaver.getWorld().behaveInJava5Way && munger.getSignature().isPublic()){ + // the below line just gets the method with the same name in aspectType.getDeclaredMethods(); + ResolvedMember realMember = getRealMemberForITDFromAspect(aspectType,interMethodBody); + if (realMember==null) throw new BCException("Couldn't find ITD init member '"+ + interMethodBody+"' on aspect "+aspectType); + annotationsOnRealMember = realMember.getAnnotations(); + } + if (onType.equals(gen.getType())) { if (onInterface) { LazyMethodGen mg = makeMethodGen(gen, @@ -1068,7 +1099,18 @@ weaver.addInitializer(this); FieldGen fg = makeFieldGen(gen, AjcMemberMaker.interFieldClassField(field, aspectType)); - gen.addField(fg.getField(),getSourceLocation()); + + if (annotationsOnRealMember!=null) { + for (int i = 0; i < annotationsOnRealMember.length; i++) { + AnnotationX annotationX = annotationsOnRealMember[i]; + Annotation a = annotationX.getBcelAnnotation(); + AnnotationGen ag = new AnnotationGen(a,weaver.getLazyClassGen().getConstantPoolGen(),true); + fg.addAnnotation(ag); + } + } + + gen.addField(fg.getField(),getSourceLocation()); + } return true; } else if (onInterface && gen.getType().isTopmostImplementor(onType)) { Index: src/org/aspectj/weaver/bcel/LazyClassGen.java =================================================================== RCS file: /home/technology/org.aspectj/modules/weaver/src/org/aspectj/weaver/bcel/LazyClassGen.java,v retrieving revision 1.30 diff -u -r1.30 LazyClassGen.java --- src/org/aspectj/weaver/bcel/LazyClassGen.java 17 May 2005 08:29:18 -0000 1.30 +++ src/org/aspectj/weaver/bcel/LazyClassGen.java 6 Jul 2005 14:23:20 -0000 @@ -886,6 +886,11 @@ myGen.addField(field); } + public void replaceField(Field oldF, Field newF){ + myGen.removeField(oldF); + myGen.addField(newF); + } + public void addField(Field field, ISourceLocation sourceLocation) { addField(field); if (!(field.isPrivate()