java-callgraph

Mark invoked methods with identifiers, to differentiate interface

6/18/2011 10:24:30 AM

Details

diff --git a/src/main/java/gr/gousiosg/javacg/stat/ClassVisitor.java b/src/main/java/gr/gousiosg/javacg/stat/ClassVisitor.java
index 36f35f1..97c1cc2 100644
--- a/src/main/java/gr/gousiosg/javacg/stat/ClassVisitor.java
+++ b/src/main/java/gr/gousiosg/javacg/stat/ClassVisitor.java
@@ -72,13 +72,13 @@ public class ClassVisitor extends EmptyVisitor {
             }
         }
     }
-    
+
     public void visitMethod(Method method) {
         MethodGen mg = new MethodGen(method, clazz.getClassName(), constants);
         MethodVisitor visitor = new MethodVisitor(mg, clazz);
         visitor.start(); 
     }
-    
+
     public void start() {
         visitJavaClass(clazz);
     }
diff --git a/src/main/java/gr/gousiosg/javacg/stat/MethodVisitor.java b/src/main/java/gr/gousiosg/javacg/stat/MethodVisitor.java
index 8fc7619..9f233cc 100644
--- a/src/main/java/gr/gousiosg/javacg/stat/MethodVisitor.java
+++ b/src/main/java/gr/gousiosg/javacg/stat/MethodVisitor.java
@@ -32,10 +32,13 @@ import org.apache.bcel.classfile.JavaClass;
 import org.apache.bcel.generic.ConstantPoolGen;
 import org.apache.bcel.generic.ConstantPushInstruction;
 import org.apache.bcel.generic.EmptyVisitor;
+import org.apache.bcel.generic.INVOKEINTERFACE;
+import org.apache.bcel.generic.INVOKESPECIAL;
+import org.apache.bcel.generic.INVOKESTATIC;
+import org.apache.bcel.generic.INVOKEVIRTUAL;
 import org.apache.bcel.generic.Instruction;
 import org.apache.bcel.generic.InstructionConstants;
 import org.apache.bcel.generic.InstructionHandle;
-import org.apache.bcel.generic.InvokeInstruction;
 import org.apache.bcel.generic.MethodGen;
 import org.apache.bcel.generic.ReturnInstruction;
 
@@ -57,7 +60,7 @@ public class MethodVisitor extends EmptyVisitor {
         mg = m;
         cp = mg.getConstantPool();
         format = "M:" + visitedClass.getClassName() + ":" + mg.getName() 
-            + " " + "%s:%s";
+            + " " + "(%s)%s:%s";
     }
 
     public void start() {
@@ -80,8 +83,23 @@ public class MethodVisitor extends EmptyVisitor {
                 && !(i instanceof ReturnInstruction));
     }
 
-    /** Method invocation. */
-    public void visitInvokeInstruction(InvokeInstruction i) {
-        System.out.println(String.format(format,i.getReferenceType(cp),i.getMethodName(cp))); 
+    @Override
+    public void visitINVOKEVIRTUAL(INVOKEVIRTUAL i) {
+        System.out.println(String.format(format,"M",i.getReferenceType(cp),i.getMethodName(cp)));
+    }
+
+    @Override
+    public void visitINVOKEINTERFACE(INVOKEINTERFACE i) {
+        System.out.println(String.format(format,"I",i.getReferenceType(cp),i.getMethodName(cp)));
+    }
+
+    @Override
+    public void visitINVOKESPECIAL(INVOKESPECIAL i) {
+        System.out.println(String.format(format,"O",i.getReferenceType(cp),i.getMethodName(cp)));
+    }
+
+    @Override
+    public void visitINVOKESTATIC(INVOKESTATIC i) {
+        System.out.println(String.format(format,"S",i.getReferenceType(cp),i.getMethodName(cp)));
     }
 }