From d6e95662492576829120f61c096b5fc1af5bd269 Mon Sep 17 00:00:00 2001 From: Andy Clement Date: Wed, 3 Apr 2013 12:58:01 -0700 Subject: [PATCH] fixed 404848 --- .../org/aspectj/weaver/ResolvedMember.java | 2 + .../aspectj/weaver/ResolvedMemberImpl.java | 23 +++++++- .../aspectj/weaver/bcel/BcelClassWeaver.java | 57 ++++++++++--------- 3 files changed, 53 insertions(+), 29 deletions(-) diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/ResolvedMember.java b/org.aspectj.matcher/src/org/aspectj/weaver/ResolvedMember.java index 60d322410..0b5def29a 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/ResolvedMember.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/ResolvedMember.java @@ -153,4 +153,6 @@ public interface ResolvedMember extends Member, AnnotatedElement, TypeVariableDe public boolean isDefaultConstructor(); + public void setAnnotations(AnnotationAJ[] annotations); + } \ No newline at end of file diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/ResolvedMemberImpl.java b/org.aspectj.matcher/src/org/aspectj/weaver/ResolvedMemberImpl.java index 6ddf51bb5..cfd0508c4 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/ResolvedMemberImpl.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/ResolvedMemberImpl.java @@ -321,9 +321,29 @@ public class ResolvedMemberImpl extends MemberImpl implements IHasPosition, Reso if (backingGenericMember != null) { return backingGenericMember.getAnnotations(); } + if (annotations!=null) { + return annotations; + } return super.getAnnotations(); } + public AnnotationAJ getAnnotationOfType(UnresolvedType ofType) { + if (annotations!=null) { + // this means they have been set (we are likely a placeholder for an ITD, so a fake member) + for (AnnotationAJ annotation: annotations) { + if (annotation.getType().equals(ofType)) { + return annotation; + } + } + return null; + } + throw new UnsupportedOperationException("You should resolve this member and call getAnnotationOfType() on the result..."); + } + + public void setAnnotations(AnnotationAJ[] annotations) { + this.annotations = annotations; + } + public void setAnnotationTypes(ResolvedType[] annotationTypes) { this.annotationTypes = annotationTypes; } @@ -1235,9 +1255,6 @@ public class ResolvedMemberImpl extends MemberImpl implements IHasPosition, Reso public void evictWeavingState() { } - public AnnotationAJ getAnnotationOfType(UnresolvedType ofType) { - throw new UnsupportedOperationException("You should resolve this member and call getAnnotationOfType() on the result..."); - } public boolean isEquivalentTo(Object other) { return this.equals(other); diff --git a/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java b/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java index dccda0505..b1534ca73 100644 --- a/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java +++ b/weaver/src/org/aspectj/weaver/bcel/BcelClassWeaver.java @@ -126,7 +126,7 @@ class BcelClassWeaver implements IClassWeaver { private final List addedThisInitializers = new ArrayList(); private final List addedClassInitializers = new ArrayList(); - private final Map mapToAnnotations = new HashMap(); + private final Map mapToAnnotationHolder = new HashMap(); // private BcelShadow clinitShadow = null; @@ -2985,51 +2985,56 @@ class BcelClassWeaver implements IClassWeaver { private void fixAnnotationsForResolvedMember(ResolvedMember rm, ResolvedMember declaredSig) { try { UnresolvedType memberHostType = declaredSig.getDeclaringType(); - ResolvedType[] annotations = mapToAnnotations.get(rm); + boolean containsKey = mapToAnnotationHolder.containsKey(rm); + ResolvedMember realAnnotationHolder = mapToAnnotationHolder.get(rm); String methodName = declaredSig.getName(); // FIXME asc shouldnt really rely on string names ! - if (annotations == null) { + if (!containsKey) { if (rm.getKind() == Member.FIELD) { if (methodName.startsWith("ajc$inlineAccessField")) { - ResolvedMember resolvedDooberry = world.resolve(rm); - annotations = resolvedDooberry.getAnnotationTypes(); + realAnnotationHolder = world.resolve(rm); } else { ResolvedMember realthing = AjcMemberMaker.interFieldInitializer(rm, memberHostType); - ResolvedMember resolvedDooberry = world.resolve(realthing); - annotations = resolvedDooberry.getAnnotationTypes(); + realAnnotationHolder = world.resolve(realthing); } } else if (rm.getKind() == Member.METHOD && !rm.isAbstract()) { if (methodName.startsWith("ajc$inlineAccessMethod") || methodName.startsWith("ajc$superDispatch")) { - ResolvedMember resolvedDooberry = world.resolve(declaredSig); - annotations = resolvedDooberry.getAnnotationTypes(); + realAnnotationHolder = world.resolve(declaredSig); } else { - ResolvedMember realthing = AjcMemberMaker.interMethodDispatcher(rm.resolve(world), memberHostType).resolve( - world); - ResolvedMember theRealMember = findResolvedMemberNamed(memberHostType.resolve(world), realthing.getName(), - realthing.getParameterTypes()); - if (theRealMember == null) { + ResolvedMember realthing = AjcMemberMaker.interMethodDispatcher(rm.resolve(world), memberHostType).resolve(world); + realAnnotationHolder = findResolvedMemberNamed(memberHostType.resolve(world), realthing.getName(),realthing.getParameterTypes()); + if (realAnnotationHolder == null) { throw new UnsupportedOperationException( "Known limitation in M4 - can't find ITD members when type variable is used as an argument and has upper bound specified"); } - annotations = theRealMember.getAnnotationTypes(); } } else if (rm.getKind() == Member.CONSTRUCTOR) { - ResolvedMember realThing = AjcMemberMaker.postIntroducedConstructor(memberHostType.resolve(world), - rm.getDeclaringType(), rm.getParameterTypes()); - ResolvedMember resolvedDooberry = world.resolve(realThing); + ResolvedMember realThing = AjcMemberMaker.postIntroducedConstructor(memberHostType.resolve(world),rm.getDeclaringType(), rm.getParameterTypes()); + realAnnotationHolder = world.resolve(realThing); // AMC temp guard for M4 - if (resolvedDooberry == null) { - throw new UnsupportedOperationException( - "Known limitation in M4 - can't find ITD members when type variable is used as an argument and has upper bound specified"); + if (realAnnotationHolder == null) { + throw new UnsupportedOperationException("Known limitation in M4 - can't find ITD members when type variable is used as an argument and has upper bound specified"); } - annotations = resolvedDooberry.getAnnotationTypes(); } - if (annotations == null) { - annotations = new ResolvedType[0]; + mapToAnnotationHolder.put(rm, realAnnotationHolder); + } + ResolvedType[] annotationTypes; + AnnotationAJ[] annotations; + if (realAnnotationHolder!=null) { + annotationTypes = realAnnotationHolder.getAnnotationTypes(); + annotations = realAnnotationHolder.getAnnotations(); + if (annotationTypes==null) { + annotationTypes = ResolvedType.EMPTY_ARRAY; + } + if (annotations==null) { + annotations = AnnotationAJ.EMPTY_ARRAY; } - mapToAnnotations.put(rm, annotations); + } else { + annotations = AnnotationAJ.EMPTY_ARRAY; + annotationTypes = ResolvedType.EMPTY_ARRAY; } - rm.setAnnotationTypes(annotations); + rm.setAnnotations(annotations); + rm.setAnnotationTypes(annotationTypes); } catch (UnsupportedOperationException ex) { throw ex; } catch (Throwable t) { -- 2.39.5