import java.io.FileReader; import java.io.IOException; import java.util.Map.Entry; import org.codehaus.commons.compiler.CompileException; import org.codehaus.janino.Java; import org.codehaus.janino.Java.Annotation; import org.codehaus.janino.Java.LocalVariable; import org.codehaus.janino.Parser; import org.codehaus.janino.Scanner; import org.codehaus.janino.util.Traverser; public class ProofOfConceptTraverser extends Traverser { public static void main(String[] args) throws CompileException, IOException { ProofOfConceptTraverser poct = new ProofOfConceptTraverser(); for (String fileName : args) { // Parse each compilation unit. FileReader r = new FileReader(fileName); Java.CompilationUnit cu; try { cu = new Parser(new Scanner(fileName, r)).parseCompilationUnit(); } finally { r.close(); } // Traverse it and count declarations. poct.traverseCompilationUnit(cu); } System.out.println("Class declarations: " + poct.classDeclarationCount); System.out.println("Interface declarations: " + poct.interfaceDeclarationCount); System.out.println("Fields: " + poct.fieldCount); System.out.println("Local variables: " + poct.localVariableCount); System.out.println("L Values: " + poct.lvalues); System.out.println("Annotations: "+poct.annotationCount); System.out.println("Annotations2: "+poct.annotationCount2); System.out.println("Annotations3: "+poct.annotationCount3); System.out.println("Annotations4: "+poct.annotationCount4); } private int methodDeclarator; // compilation unit @Override public void traverseCompilationUnit(Java.CompilationUnit cu){ System.out.println("CU: "+cu.toString()); super.traverseCompilationUnit(cu); } // traverse methods @Override public void traverseMethodDeclarator(Java.MethodDeclarator cu){ ++this.methodDeclarator; System.out.println("Method-nAME: "+cu.name); System.out.println("Method-params: "+cu.formalParameters); System.out.println("Method-type: "+cu.type); System.out.println("line number for this method: "+cu.getLocation().getLineNumber()); if(cu.localVariables != null){ for(Entry<String, LocalVariable> entry : cu.localVariables.entrySet()){ System.out.println("name: "+entry.getKey()); System.out.println("value: "+entry.getValue()); } } super.traverseMethodDeclarator(cu); } private int lvalues; // lValue @Override public void traverseLvalue(Java.Lvalue lv) { ++this.lvalues; // lv.toType().toString(); // System.out.println("LValue: "+lv.toString()); super.traverseLvalue(lv); } // Count annotations @Override public void traverseAnnotation(Java.Annotation an){ ++this.annotationCount; System.out.println("type: "+an.getType().toString()); super.traverseAnnotation(an); } private int annotationCount; // Count annotations @Override public void traverseMarkerAnnotation(Java.MarkerAnnotation an){ ++this.annotationCount2; System.out.println("type: "+an.getType().toString()); super.traverseAnnotation(an); } private int annotationCount2; // Count annotations @Override public void traverseNormalAnnotation(Java.NormalAnnotation an){ ++this.annotationCount3; System.out.println("type: "+an.getType().toString()); super.traverseAnnotation(an); } private int annotationCount3; // Count annotations @Override public void traverseSingleElementAnnotation(Java.SingleElementAnnotation an){ ++this.annotationCount4; System.out.println("type: "+an.getType().toString()); super.traverseAnnotation(an); } private int annotationCount4; // Count class declarations. @Override public void traverseClassDeclaration(Java.ClassDeclaration cd) { ++this.classDeclarationCount; super.traverseClassDeclaration(cd); } private int classDeclarationCount; // Count interface declarations. @Override public void traverseInterfaceDeclaration(Java.InterfaceDeclaration id) { ++this.interfaceDeclarationCount; super.traverseInterfaceDeclaration(id); } private int interfaceDeclarationCount; // Count fields. @Override public void traverseFieldDeclaration(Java.FieldDeclaration fd) { this.fieldCount += fd.variableDeclarators.length; Annotation[] annotations = fd.getAnnotations(); for(Annotation ann : annotations){ System.out.println("annotation: "+ann.toString()); } System.out.println("Field: "+fd.type.toString()); super.traverseFieldDeclaration(fd); } private int fieldCount; //field accesses @Override public void traverseFieldAccessExpression(Java.FieldAccessExpression fa){ System.out.println("FA: "+fa.toString()); super.traverseFieldAccessExpression(fa); } // Count local variables. @Override public void traverseLocalVariableDeclarationStatement(Java.LocalVariableDeclarationStatement lvds) { this.localVariableCount += lvds.variableDeclarators.length; System.out.println("lineNumber: "+lvds.getLocation().getLineNumber()+ " type: "+lvds.type.toString()); Java.Modifiers mods = lvds.modifiers; for(Java.Annotation ann : mods.annotations){ System.out.println("ANN-type!!: "+ann.getType()); System.out.println("ANN-string!!"+ann.toString()); } if(lvds.localVariables != null){ for(Entry<String, LocalVariable> entry : lvds.localVariables.entrySet()){ System.out.println("name: "+entry.getKey()); System.out.println("value: "+entry.getValue()); } } super.traverseLocalVariableDeclarationStatement(lvds); } private int localVariableCount; }