aboutsummaryrefslogtreecommitdiffstats
path: root/docs/sandbox/api-clients/org/aspectj/samples/AsmRelationshipMapExtensionTest.java
blob: 5ffeaa85f721a0eb85606c0cc9e09d5e60f34510 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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(), decp.getOffset());
    		IProgramElement ipe = AsmManager.getDefault().getHierarchy().findElementForHandle(sourceHandle);
  
    		String superHandle = ProgramElement.createHandleIdentifier(
    		        superType.getSourceLocation().getSourceFile(),
    		        superType.getSourceLocation().getLine(),
    		        superType.getSourceLocation().getColumn(),
    		        superType.getSourceLocation().getOffset()
            );
    				
    		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);
    		}
        }
    }
}