diff options
author | acolyer <acolyer> | 2006-05-16 15:43:08 +0000 |
---|---|---|
committer | acolyer <acolyer> | 2006-05-16 15:43:08 +0000 |
commit | b166a7e6163889eb951f82655f0f49bfc26a49f0 (patch) | |
tree | 2801163d063b198536b71b39d9c0a340d9f753fc /weaver | |
parent | fc7db25dad5d302221669c7cfdb4890f061d2e9e (diff) | |
download | aspectj-b166a7e6163889eb951f82655f0f49bfc26a49f0.tar.gz aspectj-b166a7e6163889eb951f82655f0f49bfc26a49f0.zip |
tests and fix for pr130722, 138219
Diffstat (limited to 'weaver')
6 files changed, 28 insertions, 23 deletions
diff --git a/weaver/src/org/aspectj/weaver/CrosscuttingMembers.java b/weaver/src/org/aspectj/weaver/CrosscuttingMembers.java index 46b6ada85..d96842d10 100644 --- a/weaver/src/org/aspectj/weaver/CrosscuttingMembers.java +++ b/weaver/src/org/aspectj/weaver/CrosscuttingMembers.java @@ -63,9 +63,12 @@ public class CrosscuttingMembers { private List declareAnnotationsOnField = new ArrayList(); private List declareAnnotationsOnMethods = new ArrayList(); // includes ctors - public CrosscuttingMembers(ResolvedType inAspect) { + private boolean shouldConcretizeIfNeeded = true; + + public CrosscuttingMembers(ResolvedType inAspect, boolean shouldConcretizeIfNeeded) { this.inAspect = inAspect; this.world = inAspect.getWorld(); + this.shouldConcretizeIfNeeded = shouldConcretizeIfNeeded; } // public void addConcreteShadowMungers(Collection c) { @@ -214,9 +217,11 @@ public class CrosscuttingMembers { public boolean replaceWith(CrosscuttingMembers other,boolean careAboutShadowMungers) { boolean changed = false; - if (perClause == null || !perClause.equals(other.perClause)) { - changed = true; - perClause = other.perClause; + if (careAboutShadowMungers) { + if (perClause == null || !perClause.equals(other.perClause)) { + changed = true; + perClause = other.perClause; + } } //XXX all of the below should be set equality rather than list equality @@ -357,12 +362,12 @@ public class CrosscuttingMembers { return changed; } - public PerClause getPerClause() { - return perClause; - } - public void setPerClause(PerClause perClause) { - this.perClause = perClause.concretize(inAspect); + if (this.shouldConcretizeIfNeeded) { + this.perClause = perClause.concretize(inAspect); + } else { + this.perClause = perClause; + } } public List getDeclareDominates() { diff --git a/weaver/src/org/aspectj/weaver/CrosscuttingMembersSet.java b/weaver/src/org/aspectj/weaver/CrosscuttingMembersSet.java index 2b7c4ff32..1861022b9 100644 --- a/weaver/src/org/aspectj/weaver/CrosscuttingMembersSet.java +++ b/weaver/src/org/aspectj/weaver/CrosscuttingMembersSet.java @@ -61,22 +61,22 @@ public class CrosscuttingMembersSet { * @return whether or not that was a change to the global signature * XXX for efficiency we will need a richer representation than this */ - public boolean addOrReplaceAspect(ResolvedType aspectType,boolean careAboutShadowMungers) { + public boolean addOrReplaceAspect(ResolvedType aspectType, boolean inWeavingPhase) { boolean change = false; CrosscuttingMembers xcut = (CrosscuttingMembers)members.get(aspectType); if (xcut == null) { - members.put(aspectType, aspectType.collectCrosscuttingMembers()); + members.put(aspectType, aspectType.collectCrosscuttingMembers(inWeavingPhase)); clearCaches(); CflowPointcut.clearCaches(aspectType); change = true; } else { - if (xcut.replaceWith(aspectType.collectCrosscuttingMembers(),careAboutShadowMungers)) { + if (xcut.replaceWith(aspectType.collectCrosscuttingMembers(inWeavingPhase),inWeavingPhase)) { clearCaches(); CflowPointcut.clearCaches(aspectType); change = true; } else { - if (!World.compareLocations && careAboutShadowMungers) { + if (!World.compareLocations && inWeavingPhase) { // bug 134541 - even though we haven't changed we may have updated the // sourcelocation for the shadowMunger which we need to pick up shadowMungers = null; @@ -86,14 +86,14 @@ public class CrosscuttingMembersSet { } if (aspectType.isAbstract()) { // we might have sub-aspects that need to re-collect their crosscutting members from us - boolean ancestorChange = addOrReplaceDescendantsOf(aspectType,careAboutShadowMungers); + boolean ancestorChange = addOrReplaceDescendantsOf(aspectType,inWeavingPhase); change = change || ancestorChange; } changedSinceLastReset = changedSinceLastReset || change; return change; } - private boolean addOrReplaceDescendantsOf(ResolvedType aspectType,boolean careAboutShadowMungers) { + private boolean addOrReplaceDescendantsOf(ResolvedType aspectType, boolean inWeavePhase) { //System.err.println("Looking at descendants of "+aspectType.getName()); Set knownAspects = members.keySet(); Set toBeReplaced = new HashSet(); @@ -106,7 +106,7 @@ public class CrosscuttingMembersSet { boolean change = false; for (Iterator it = toBeReplaced.iterator(); it.hasNext(); ) { ResolvedType next = (ResolvedType)it.next(); - boolean thisChange = addOrReplaceAspect(next,careAboutShadowMungers); + boolean thisChange = addOrReplaceAspect(next,inWeavePhase); change = change || thisChange; } return change; diff --git a/weaver/src/org/aspectj/weaver/ResolvedType.java b/weaver/src/org/aspectj/weaver/ResolvedType.java index d220bcb0c..84da56906 100644 --- a/weaver/src/org/aspectj/weaver/ResolvedType.java +++ b/weaver/src/org/aspectj/weaver/ResolvedType.java @@ -498,8 +498,8 @@ public abstract class ResolvedType extends UnresolvedType implements AnnotatedEl //??? collecting data-structure, shouldn't really be a field public CrosscuttingMembers crosscuttingMembers; - public CrosscuttingMembers collectCrosscuttingMembers() { - crosscuttingMembers = new CrosscuttingMembers(this); + public CrosscuttingMembers collectCrosscuttingMembers(boolean shouldConcretizeIfNeeded) { + crosscuttingMembers = new CrosscuttingMembers(this,shouldConcretizeIfNeeded); crosscuttingMembers.setPerClause(getPerClause()); crosscuttingMembers.addShadowMungers(collectShadowMungers()); crosscuttingMembers.addTypeMungers(getTypeMungers()); diff --git a/weaver/testsrc/org/aspectj/weaver/bcel/NonstaticWeaveTestCase.java b/weaver/testsrc/org/aspectj/weaver/bcel/NonstaticWeaveTestCase.java index 0a35627de..3559f8f5f 100644 --- a/weaver/testsrc/org/aspectj/weaver/bcel/NonstaticWeaveTestCase.java +++ b/weaver/testsrc/org/aspectj/weaver/bcel/NonstaticWeaveTestCase.java @@ -45,7 +45,7 @@ public class NonstaticWeaveTestCase extends WeaveTestCase { per.resolve(new TestScope(new String[0], new String[0], world)); ResolvedType onAspect = world.resolve("Aspect"); - CrosscuttingMembers xcut = new CrosscuttingMembers(onAspect); + CrosscuttingMembers xcut = new CrosscuttingMembers(onAspect,true); onAspect.crosscuttingMembers = xcut; per = per.concretize(onAspect); @@ -64,7 +64,7 @@ public class NonstaticWeaveTestCase extends WeaveTestCase { per.resolve(new TestScope(new String[0], new String[0], world)); ResolvedType onAspect = world.resolve("Aspect"); - CrosscuttingMembers xcut = new CrosscuttingMembers(onAspect); + CrosscuttingMembers xcut = new CrosscuttingMembers(onAspect,true); onAspect.crosscuttingMembers = xcut; per = per.concretize(onAspect); diff --git a/weaver/testsrc/org/aspectj/weaver/bcel/PointcutResidueTestCase.java b/weaver/testsrc/org/aspectj/weaver/bcel/PointcutResidueTestCase.java index 3c2701241..3bec378af 100644 --- a/weaver/testsrc/org/aspectj/weaver/bcel/PointcutResidueTestCase.java +++ b/weaver/testsrc/org/aspectj/weaver/bcel/PointcutResidueTestCase.java @@ -196,7 +196,7 @@ public class PointcutResidueTestCase extends WeaveTestCase { 0, -1, -1, null, null); ResolvedType inAspect = world.resolve("Aspect"); - CrosscuttingMembers xcut = new CrosscuttingMembers(inAspect); + CrosscuttingMembers xcut = new CrosscuttingMembers(inAspect,true); inAspect.crosscuttingMembers = xcut; ShadowMunger cp = pp.concretize(inAspect, world, null); diff --git a/weaver/testsrc/org/aspectj/weaver/bcel/WeaveOrderTestCase.java b/weaver/testsrc/org/aspectj/weaver/bcel/WeaveOrderTestCase.java index 5976acd03..89c1b2e29 100644 --- a/weaver/testsrc/org/aspectj/weaver/bcel/WeaveOrderTestCase.java +++ b/weaver/testsrc/org/aspectj/weaver/bcel/WeaveOrderTestCase.java @@ -80,7 +80,7 @@ public class WeaveOrderTestCase extends WeaveTestCase { new PatternParser("declare precedence: java.lang.String, java.lang.Throwable").parseDeclare(); //??? concretize dom ResolvedType aType = world.resolve("Aspect"); - CrosscuttingMembers xcut = new CrosscuttingMembers(aType); + CrosscuttingMembers xcut = new CrosscuttingMembers(aType,true); aType.crosscuttingMembers = xcut; xcut.addDeclare(dom); world.getCrosscuttingMembersSet().addFixedCrosscuttingMembers(aType); @@ -108,7 +108,7 @@ public class WeaveOrderTestCase extends WeaveTestCase { new PatternParser("declare precedence: *, java.lang.String, java.lang.Throwable").parseDeclare(); //??? concretize dom ResolvedType aType = world.resolve("Aspect"); - CrosscuttingMembers xcut = new CrosscuttingMembers(aType); + CrosscuttingMembers xcut = new CrosscuttingMembers(aType,true); aType.crosscuttingMembers = xcut; xcut.addDeclare(dom); world.getCrosscuttingMembersSet().addFixedCrosscuttingMembers(aType); |