]> source.dussan.org Git - aspectj.git/commitdiff
Added support for clients to extend the ASM relationships in order to add
authormkersten <mkersten>
Wed, 18 Aug 2004 23:38:38 +0000 (23:38 +0000)
committermkersten <mkersten>
Wed, 18 Aug 2004 23:38:38 +0000 (23:38 +0000)
new relationships (such as the example in the sandbox that adds additional
declared-parents relationships).  There is no structural change to the compiler
or weaver.  The AsmRelationshipProvider is now accessed by getDefault()
instead of statically, and its instance can be reset to be a subtype.

docs/sandbox/api-clients/.classpath
docs/sandbox/api-clients/org/aspectj/samples/AsmRelationshipMapExtensionTest.java [new file with mode: 0644]
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/AjLookupEnvironment.java
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/AsmInterTypeRelationshipProvider.java
weaver/src/org/aspectj/weaver/AsmRelationshipProvider.java
weaver/src/org/aspectj/weaver/Checker.java
weaver/src/org/aspectj/weaver/Shadow.java
weaver/src/org/aspectj/weaver/bcel/BcelTypeMunger.java

index 66888ff8cecb87222310fac6f11b5de8eb900e0c..03a2855eafd69b08af8f5ed5325e7aac4bcbfd80 100644 (file)
@@ -10,5 +10,6 @@
        <classpathentry kind="var" path="JUNIT_HOME/junit.jar"/>
        <classpathentry kind="lib" path="/org.aspectj.ajdt.core/out/lib.jar"/>
        <classpathentry kind="src" path="/org.eclipse.jdt.core"/>
+       <classpathentry kind="src" path="/weaver"/>
        <classpathentry kind="output" path=""/>
 </classpath>
diff --git a/docs/sandbox/api-clients/org/aspectj/samples/AsmRelationshipMapExtensionTest.java b/docs/sandbox/api-clients/org/aspectj/samples/AsmRelationshipMapExtensionTest.java
new file mode 100644 (file)
index 0000000..11b9ff0
--- /dev/null
@@ -0,0 +1,88 @@
+package org.aspectj.samples;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.aspectj.ajde.AjdeTestCase;
+import org.aspectj.asm.*;
+import org.aspectj.asm.internal.ProgramElement;
+import org.aspectj.bridge.ISourceLocation;
+import org.aspectj.weaver.AsmRelationshipProvider;
+import org.aspectj.weaver.ResolvedTypeX;
+
+/**
+ * @author Mik Kersten
+ */
+public class AsmRelationshipMapExtensionTest extends AjdeTestCase {
+
+    public void testDeclares() {
+        System.out.println("----------------------------------");
+        System.out.println("Parents declared by declare parents statements: ");
+        HierarchyWalker walker = new HierarchyWalker() {
+            public void preProcess(IProgramElement node) {
+                if (node.getKind().equals(IProgramElement.Kind.DECLARE_PARENTS)) {
+                    System.out.println(node);
+
+                    List relations = AsmManager.getDefault().getRelationshipMap().get(node);
+                    if (relations != null) {
+                        for (Iterator it = relations.iterator(); it.hasNext();) {
+                            IRelationship relationship = (IRelationship) it.next();
+                            List targets = relationship.getTargets();
+                            for (Iterator iter = targets.iterator(); iter.hasNext();) {
+                                IProgramElement currElt = AsmManager
+                                        .getDefault().getHierarchy()
+                                        .getElement((String) iter.next());
+                                System.out.println("--> " + relationship.getName() + ": " + currElt);
+                            }
+                        }
+                    }
+                }
+            }
+        };
+        AsmManager.getDefault().getHierarchy().getRoot().walk(walker);
+    }
+
+    protected void setUp() throws Exception {
+        AsmRelationshipProvider.setDefault(new DeclareInfoProvider());
+        super.setUp("examples");
+        assertTrue("build success",
+                doSynchronousBuild("../examples/coverage/coverage.lst"));
+    }
+}
+
+class DeclareInfoProvider extends AsmRelationshipProvider {
+    
+    public void addDeclareParentsRelationship(ISourceLocation decp,
+            ResolvedTypeX targetType, List newParents) {
+        super.addDeclareParentsRelationship(decp, targetType, newParents);
+        for (Iterator it = newParents.iterator(); it.hasNext();) {
+            ResolvedTypeX superType = (ResolvedTypeX) it.next();
+            
+               String sourceHandle = ProgramElement.createHandleIdentifier(decp.getSourceFile(),decp.getLine(),decp.getColumn());
+               IProgramElement ipe = AsmManager.getDefault().getHierarchy().findElementForHandle(sourceHandle);
+
+               String superHandle = ProgramElement.createHandleIdentifier(
+                       superType.getSourceLocation().getSourceFile(),
+                       superType.getSourceLocation().getLine(),
+                       superType.getSourceLocation().getColumn());
+                               
+               if (sourceHandle != null && superHandle != null) {
+                       IRelationship foreward = AsmManager.getDefault().getRelationshipMap().get(
+                               sourceHandle, 
+                               IRelationship.Kind.DECLARE, 
+                               "super types declared",
+                               false,
+                               true);
+                       foreward.addTarget(superHandle);
+                               
+                       IRelationship back = AsmManager.getDefault().getRelationshipMap().get(
+                               superHandle, IRelationship.Kind.DECLARE, 
+                               "declared as super type by",
+                               false,
+                               true);
+                       back.addTarget(sourceHandle);
+               }
+        }
+    }
+}
\ No newline at end of file
index 0acbb6465204a1b576a58ef39397120dd506589c..110d7539ef615179bf5870eb479f614172ff8e07 100644 (file)
@@ -329,7 +329,7 @@ public class AjLookupEnvironment extends LookupEnvironment {
                                // (When done at weave time, it is done by invoking addRelationship() on 
                                // AsmRelationshipProvider (see BCELTypeMunger)
                                if (!ResolvedTypeMunger.persistSourceLocation) // Do it up front if we bloody have to
-                                AsmInterTypeRelationshipProvider.addRelationship(onType, munger);
+                                AsmInterTypeRelationshipProvider.getDefault().addRelationship(onType, munger);
                        }
                }
                
@@ -362,7 +362,7 @@ public class AjLookupEnvironment extends LookupEnvironment {
                                                                                onType + ": " + dangerousInterfaces.get(parent),
                                                                                onType.getSourceLocation(), null);
                                }
-                               AsmRelationshipProvider.addDeclareParentsRelationship(declareParents.getSourceLocation(),factory.fromEclipse(sourceType));
+                               AsmRelationshipProvider.getDefault().addDeclareParentsRelationship(declareParents.getSourceLocation(),factory.fromEclipse(sourceType), newParents);
                                addParent(sourceType, parent);
                        }
                }
index bb97a6ddde36fbc5cb5a16141c3409c84264a7b3..ad43d9ee9691c8ffb4d1b6c854743185c427f7b3 100644 (file)
@@ -19,14 +19,18 @@ import org.aspectj.asm.internal.ProgramElement;
 import org.aspectj.weaver.*;
 
 /**
+ * !!! is this class still being used?
+ * 
  * @author Mik Kersten
  */
 public class AsmInterTypeRelationshipProvider {
 
+    protected static AsmInterTypeRelationshipProvider INSTANCE = new AsmInterTypeRelationshipProvider();
+    
        public static final String INTER_TYPE_DECLARES = "declared on";
        public static final String INTER_TYPE_DECLARED_BY = "aspect declarations";
 
-       public static void addRelationship(
+       public void addRelationship(
                ResolvedTypeX onType,
                EclipseTypeMunger munger) {
                        
@@ -63,4 +67,16 @@ public class AsmInterTypeRelationshipProvider {
                        }
                }
        }
+       
+    public static AsmInterTypeRelationshipProvider getDefault() {
+        return INSTANCE;
+    }
+    
+    /**
+     * Reset the instance of this class, intended for extensibility.
+     * This enables a subclass to become used as the default instance.
+     */
+    public static void setDefault(AsmInterTypeRelationshipProvider instance) {
+        INSTANCE = instance;
+    }
 }
index 176fbad008a33f21cb933414d7d314e0587b6390..2d65bc14d13853a88e80b45c001f257b22df95c8 100644 (file)
@@ -13,6 +13,7 @@
 
 package org.aspectj.weaver;
 
+import java.util.*;
 import java.util.ArrayList;
 import java.util.Iterator;
 
@@ -28,6 +29,8 @@ import org.aspectj.weaver.bcel.BcelAdvice;
 
 public class AsmRelationshipProvider {
        
+    protected static AsmRelationshipProvider INSTANCE = new AsmRelationshipProvider();
+    
        public static final String ADVISES = "advises";
        public static final String ADVISED_BY = "advised by";
        public static final String DECLARES_ON = "declares on";
@@ -36,8 +39,8 @@ public class AsmRelationshipProvider {
        public static final String MATCHES_DECLARE = "matches declare";
        public static final String INTER_TYPE_DECLARES = "declared on";
        public static final String INTER_TYPE_DECLARED_BY = "aspect declarations";
-
-       public static void checkerMunger(IHierarchy model, Shadow shadow, Checker checker) {
+       
+       public void checkerMunger(IHierarchy model, Shadow shadow, Checker checker) {
                if (shadow.getSourceLocation() == null || checker.getSourceLocation() == null) return;
                
                String sourceHandle = ProgramElement.createHandleIdentifier(
@@ -65,7 +68,7 @@ public class AsmRelationshipProvider {
        }
 
     // For ITDs
-       public static void addRelationship(
+       public void addRelationship(
                ResolvedTypeX onType,
                ResolvedTypeMunger munger,
                ResolvedTypeX originatingAspect) {
@@ -102,7 +105,7 @@ public class AsmRelationshipProvider {
                }
        }
        
-       public static void addDeclareParentsRelationship(ISourceLocation decp,ResolvedTypeX targetType) {
+       public void addDeclareParentsRelationship(ISourceLocation decp,ResolvedTypeX targetType, List newParents) {
 
                String sourceHandle = ProgramElement.createHandleIdentifier(decp.getSourceFile(),decp.getLine(),decp.getColumn());
                
@@ -125,7 +128,7 @@ public class AsmRelationshipProvider {
                
        }
        
-       public static void adviceMunger(IHierarchy model, Shadow shadow, ShadowMunger munger) {
+       public void adviceMunger(IHierarchy model, Shadow shadow, ShadowMunger munger) {
                if (munger instanceof Advice) {
                        Advice advice = (Advice)munger;
                        
@@ -168,7 +171,7 @@ public class AsmRelationshipProvider {
                }
        }
 
-       private static IProgramElement getNode(IHierarchy model, Shadow shadow) {
+       private IProgramElement getNode(IHierarchy model, Shadow shadow) {
                Member enclosingMember = shadow.getEnclosingCodeSignature();
                
                IProgramElement enclosingNode = lookupMember(model, enclosingMember);
@@ -189,13 +192,13 @@ public class AsmRelationshipProvider {
                }
        }
        
-       private static boolean sourceLinesMatch(ISourceLocation loc1,ISourceLocation loc2) {
+       private boolean sourceLinesMatch(ISourceLocation loc1,ISourceLocation loc2) {
                if (loc1.getLine()!=loc2.getLine()) return false;
                return true;
        }
        
        
-       private static IProgramElement findOrCreateCodeNode(IProgramElement enclosingNode, Member shadowSig, Shadow shadow)
+       private IProgramElement findOrCreateCodeNode(IProgramElement enclosingNode, Member shadowSig, Shadow shadow)
        {
                for (Iterator it = enclosingNode.getChildren().iterator(); it.hasNext(); ) {
                        IProgramElement node = (IProgramElement)it.next();
@@ -224,14 +227,14 @@ public class AsmRelationshipProvider {
                return peNode;
        }
        
-       private static IProgramElement lookupMember(IHierarchy model, Member member) {
+       private IProgramElement lookupMember(IHierarchy model, Member member) {
                TypeX declaringType = member.getDeclaringType();
                IProgramElement classNode =
                        model.findElementForType(declaringType.getPackageName(), declaringType.getClassName());
                return findMemberInClass(classNode, member);
        }
  
-       private static IProgramElement findMemberInClass(
+       private IProgramElement findMemberInClass(
                IProgramElement classNode,
                Member member)
        {
@@ -275,4 +278,16 @@ public class AsmRelationshipProvider {
 //             }
 //     }
 
+    public static AsmRelationshipProvider getDefault() {
+        return INSTANCE;
+    }
+    
+    /**
+     * Reset the instance of this class, intended for extensibility.
+     * This enables a subclass to become used as the default instance.
+     */
+    public static void setDefault(AsmRelationshipProvider instance) {
+        INSTANCE = instance;
+    }
+       
 }
index 8c8107e96f7fbfac023107a45c31970f834fe043..cfed2751074279da7fa1a49819da4fa7f480aa62 100644 (file)
@@ -66,7 +66,7 @@ public class Checker extends ShadowMunger {
                        }
                        
                        if (world.getModel() != null) {
-                               AsmRelationshipProvider.checkerMunger(world.getModel(), shadow, this);
+                               AsmRelationshipProvider.getDefault().checkerMunger(world.getModel(), shadow, this);
                        }
                }
                return false;
index 58ae6e7233f854ccc3fb36ae5da0de78189a420b..de2348a4dc6f13b4ed1732812e6a3a7128166b62 100644 (file)
@@ -458,7 +458,7 @@ public abstract class Shadow {
                        
                        if (world.getModel() != null) {
                                //System.err.println("munger: " + munger + " on " + this);
-                               AsmRelationshipProvider.adviceMunger(world.getModel(), this, munger);
+                               AsmRelationshipProvider.getDefault().adviceMunger(world.getModel(), this, munger);
                        }
                }
        }
index c6f05aba5ef46b617444f5029c0879414ede5c4e..b490e3d2170e249ab7ea445f83c4034bd431fc69 100644 (file)
@@ -87,9 +87,9 @@ public class BcelTypeMunger extends ConcreteTypeMunger {
                if (ResolvedTypeMunger.persistSourceLocation) {
                        if (changed) {
                                if (munger.getKind().equals(ResolvedTypeMunger.Parent)) {
-                                 AsmRelationshipProvider.addRelationship(weaver.getLazyClassGen().getType(), munger,getAspectType());
+                                 AsmRelationshipProvider.getDefault().addRelationship(weaver.getLazyClassGen().getType(), munger,getAspectType());
                                } else {
-                                 AsmRelationshipProvider.addRelationship(weaver.getLazyClassGen().getType(), munger,getAspectType());  
+                                 AsmRelationshipProvider.getDefault().addRelationship(weaver.getLazyClassGen().getType(), munger,getAspectType());     
                                }
                        }
                }