diff options
5 files changed, 97 insertions, 21 deletions
diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/AjLookupEnvironment.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/AjLookupEnvironment.java index 4f9badc83..711eb25fc 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/AjLookupEnvironment.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/AjLookupEnvironment.java @@ -92,21 +92,10 @@ public class AjLookupEnvironment extends LookupEnvironment { SourceTypeBinding[] b = units[i].scope.topLevelTypes; for (int j = 0; j < b.length; j++) { buildInterTypeAndPerClause(b[j].scope); - } - } - for (int i = lastCompletedUnitIndex + 1; i <= lastUnitIndex; i++) { - SourceTypeBinding[] b = units[i].scope.topLevelTypes; - for (int j = 0; j < b.length; j++) { - resolvePointcutDeclarations(b[j].scope); - } - } - - for (int i = lastCompletedUnitIndex + 1; i <= lastUnitIndex; i++) { - SourceTypeBinding[] b = units[i].scope.topLevelTypes; - for (int j = 0; j < b.length; j++) { addCrosscuttingStructures(b[j].scope); } - } + } + factory.finishTypeMungers(); // now do weaving @@ -118,8 +107,25 @@ public class AjLookupEnvironment extends LookupEnvironment { for (int i = lastCompletedUnitIndex + 1; i <= lastUnitIndex; i++) { weaveInterTypeDeclarations(units[i].scope, typeMungers, declareParents); - units[i] = null; // release unnecessary reference to the parsed unit } + + for (int i = lastCompletedUnitIndex + 1; i <= lastUnitIndex; i++) { + SourceTypeBinding[] b = units[i].scope.topLevelTypes; + for (int j = 0; j < b.length; j++) { + resolvePointcutDeclarations(b[j].scope); + } + } + + for (int i = lastCompletedUnitIndex + 1; i <= lastUnitIndex; i++) { + SourceTypeBinding[] b = units[i].scope.topLevelTypes; + for (int j = 0; j < b.length; j++) { + addAdviceLikeDeclares(b[j].scope); + } + } + + for (int i = lastCompletedUnitIndex + 1; i <= lastUnitIndex; i++) { + units[i] = null; // release unnecessary reference to the parsed unit + } stepCompleted = BUILD_FIELDS_AND_METHODS; lastCompletedUnitIndex = lastUnitIndex; @@ -132,6 +138,21 @@ public class AjLookupEnvironment extends LookupEnvironment { } pendingTypesToWeave.clear(); } + + private void addAdviceLikeDeclares(ClassScope s) { + TypeDeclaration dec = s.referenceContext; + + if (dec instanceof AspectDeclaration) { + ResolvedTypeX typeX = factory.fromEclipse(dec.binding); + factory.getWorld().getCrosscuttingMembersSet().addAdviceLikeDeclares(typeX); + } + + SourceTypeBinding sourceType = s.referenceContext.binding; + ReferenceBinding[] memberTypes = sourceType.memberTypes; + for (int i = 0, length = memberTypes.length; i < length; i++) { + addCrosscuttingStructures(((SourceTypeBinding) memberTypes[i]).scope); + } + } private void addCrosscuttingStructures(ClassScope s) { TypeDeclaration dec = s.referenceContext; diff --git a/tests/ajcTests.xml b/tests/ajcTests.xml index a50e6940d..39dd3b146 100644 --- a/tests/ajcTests.xml +++ b/tests/ajcTests.xml @@ -6751,4 +6751,10 @@ <compile files="aspects/Softener.aj,test/NoSoftener.java"/> <run class="test.NoSoftener"/> </ajc-test> + + <ajc-test dir="bugs" pr="42993" + title="Interaction between pointcut binding and declare parents"> + <compile files="ParentsAndPointcuts.java"/> + <run class="ParentsAndPointcuts"/> + </ajc-test> </suite> diff --git a/tests/bugs/ParentsAndPointcuts.java b/tests/bugs/ParentsAndPointcuts.java new file mode 100644 index 000000000..522c29ea5 --- /dev/null +++ b/tests/bugs/ParentsAndPointcuts.java @@ -0,0 +1,44 @@ +import org.aspectj.testing.Tester; + +public class ParentsAndPointcuts { + public static void main(String[] args) { + ContainerDescriptor d = new ContainerDescriptor(); + Tester.check(d instanceof AbstractCaching.Key, "instanceof"); + } +} + +aspect AspectBug extends AbstractCaching +perthis(execution(ContainerLoader+.new(..))) +{ + declare parents: ContainerDescriptor implements AbstractCaching.Key; + + protected pointcut loadExecutions( Key key ): + ContainerLoader.containerLoads( *, key ); +} + +abstract aspect AbstractCaching { + interface Key {} + protected abstract pointcut loadExecutions(Key key); +} + +class Key { +} + +class ContainerDescriptor { +} + +class ActiveContainer { +} + +class ContainerLoader { + public ActiveContainer createContainer(ContainerDescriptor c) { + return null; + } + + public pointcut containerLoads(ContainerLoader loader, + +ContainerDescriptor containerDesc ): + this(loader) && args(containerDesc) + && execution(ActiveContainer ContainerLoader.createContainer +(ContainerDescriptor)); +}
\ No newline at end of file diff --git a/weaver/src/org/aspectj/weaver/CrosscuttingMembersSet.java b/weaver/src/org/aspectj/weaver/CrosscuttingMembersSet.java index ec81a0cf2..2dcae923c 100644 --- a/weaver/src/org/aspectj/weaver/CrosscuttingMembersSet.java +++ b/weaver/src/org/aspectj/weaver/CrosscuttingMembersSet.java @@ -59,6 +59,11 @@ public class CrosscuttingMembersSet { } } } + + public void addAdviceLikeDeclares(ResolvedTypeX aspectType) { + CrosscuttingMembers xcut = (CrosscuttingMembers)members.get(aspectType); + xcut.addDeclares(aspectType.collectDeclares(true)); + } public boolean deleteAspect(TypeX aspectType) { boolean isAspect = members.remove(aspectType) != null; @@ -69,7 +74,7 @@ public class CrosscuttingMembersSet { public boolean containsAspect(TypeX aspectType) { return members.containsKey(aspectType); } - + //XXX only for testing public void addFixedCrosscuttingMembers(ResolvedTypeX aspectType) { members.put(aspectType, aspectType.crosscuttingMembers); @@ -139,8 +144,5 @@ public class CrosscuttingMembersSet { declareDominates = ret; } return declareDominates; - } - - - + } } diff --git a/weaver/src/org/aspectj/weaver/ResolvedTypeX.java b/weaver/src/org/aspectj/weaver/ResolvedTypeX.java index e3504fcbe..d4526ec9d 100644 --- a/weaver/src/org/aspectj/weaver/ResolvedTypeX.java +++ b/weaver/src/org/aspectj/weaver/ResolvedTypeX.java @@ -329,14 +329,14 @@ public abstract class ResolvedTypeX extends TypeX { crosscuttingMembers.setPerClause(getPerClause()); crosscuttingMembers.addShadowMungers(collectShadowMungers()); crosscuttingMembers.addTypeMungers(getTypeMungers()); - crosscuttingMembers.addDeclares(collectDeclares()); + crosscuttingMembers.addDeclares(collectDeclares(!this.doesNotExposeShadowMungers())); crosscuttingMembers.addPrivilegedAccesses(getPrivilegedAccesses()); //System.err.println("collected cc members: " + this + ", " + collectDeclares()); return crosscuttingMembers; } - private final Collection collectDeclares() { + public final Collection collectDeclares(boolean includeAdviceLike) { if (! this.isAspect() ) return Collections.EMPTY_LIST; ArrayList ret = new ArrayList(); @@ -345,6 +345,9 @@ public abstract class ResolvedTypeX extends TypeX { Declare dec = (Declare) i.next(); if (!dec.isAdviceLike()) ret.add(dec); } + + if (!includeAdviceLike) return ret; + if (!this.isAbstract()) { //ret.addAll(getDeclares()); final Iterators.Filter dupFilter = Iterators.dupFilter(); |