summaryrefslogtreecommitdiffstats
path: root/org.aspectj.matcher/src/org
diff options
context:
space:
mode:
authoraclement <aclement>2009-09-15 19:41:37 +0000
committeraclement <aclement>2009-09-15 19:41:37 +0000
commit6164d9b825a2d9a4e40245c6acccf2a9395a62dd (patch)
treedc10e05fd90f6ac3fda62bd7d62a0f4932179c2e /org.aspectj.matcher/src/org
parent8b52892aea51f85301a3f2a3c20800faab568c05 (diff)
downloadaspectj-6164d9b825a2d9a4e40245c6acccf2a9395a62dd.tar.gz
aspectj-6164d9b825a2d9a4e40245c6acccf2a9395a62dd.zip
124460 and refactoring
Diffstat (limited to 'org.aspectj.matcher/src/org')
-rw-r--r--org.aspectj.matcher/src/org/aspectj/weaver/ShadowMunger.java25
-rw-r--r--org.aspectj.matcher/src/org/aspectj/weaver/World.java10
2 files changed, 33 insertions, 2 deletions
diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/ShadowMunger.java b/org.aspectj.matcher/src/org/aspectj/weaver/ShadowMunger.java
index a55c84fd0..f31655ed2 100644
--- a/org.aspectj.matcher/src/org/aspectj/weaver/ShadowMunger.java
+++ b/org.aspectj.matcher/src/org/aspectj/weaver/ShadowMunger.java
@@ -16,9 +16,14 @@ import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
+import org.aspectj.bridge.IMessage;
import org.aspectj.bridge.ISourceLocation;
+import org.aspectj.bridge.MessageUtil;
import org.aspectj.bridge.SourceLocation;
import org.aspectj.util.PartialOrder;
import org.aspectj.weaver.patterns.PerClause;
@@ -67,7 +72,7 @@ public abstract class ShadowMunger implements PartialOrder.PartialComparable, IH
this.end = end;
this.sourceContext = sourceContext;
}
-
+
/**
* All overriding methods should call super
*/
@@ -75,8 +80,24 @@ public abstract class ShadowMunger implements PartialOrder.PartialComparable, IH
if (world.isXmlConfigured() && world.isAspectIncluded(declaringType)) {
TypePattern scoped = world.getAspectScope(declaringType);
if (scoped != null) {
- boolean b = scoped.matches(shadow.getEnclosingType().resolve(world), TypePattern.STATIC).alwaysTrue();
+ // Check the 'cached' exclusion map
+ Set<ResolvedType> excludedTypes = world.getExclusionMap().get(declaringType);
+ ResolvedType type = shadow.getEnclosingType().resolve(world);
+ if (excludedTypes!=null && excludedTypes.contains(type)) {
+ return false;
+ }
+ boolean b = scoped.matches(type, TypePattern.STATIC).alwaysTrue();
if (!b) {
+ if (!world.getMessageHandler().isIgnoring(IMessage.INFO)) {
+ world.getMessageHandler().handleMessage(MessageUtil.info("Type '"+type.getName()+"' not woven by aspect '"+declaringType.getName()+"' due to scope exclusion in XML definition"));
+ }
+ if (excludedTypes==null) {
+ excludedTypes = new HashSet<ResolvedType>();
+ excludedTypes.add(type);
+ world.getExclusionMap().put(declaringType,excludedTypes);
+ } else {
+ excludedTypes.add(type);
+ }
return false;
}
}
diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/World.java b/org.aspectj.matcher/src/org/aspectj/weaver/World.java
index cdb01a1c8..dd61947a3 100644
--- a/org.aspectj.matcher/src/org/aspectj/weaver/World.java
+++ b/org.aspectj.matcher/src/org/aspectj/weaver/World.java
@@ -1396,5 +1396,15 @@ public abstract class World implements Dump.INode {
protected boolean isExpendable(ResolvedType type) {
return (!type.equals(UnresolvedType.OBJECT) && (!type.isExposedToWeaver()) && (!type.isPrimitiveType()));
}
+
+
+ // map from aspect > excluded types
+ // memory issue here?
+ private Map<ResolvedType,Set<ResolvedType>> exclusionMap = new HashMap<ResolvedType,Set<ResolvedType>>();
+
+
+ public Map<ResolvedType,Set<ResolvedType>> getExclusionMap() {
+ return exclusionMap;
+ }
} \ No newline at end of file