Clover coverage report - PMD - 3.9
Coverage timestamp: Tue Dec 19 2006 09:38:44 EST
file stats: LOC: 394   Methods: 70
NCLOC: 289   Classes: 5
 
 Source file Conditionals Statements Methods TOTAL
PMDASMVisitor.java 52.9% 49% 38.6% 46%
coverage coverage
 1    /**
 2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
 3    */
 4    package net.sourceforge.pmd.typeresolution.visitors;
 5   
 6    import org.objectweb.asm.AnnotationVisitor;
 7    import org.objectweb.asm.Attribute;
 8    import org.objectweb.asm.ClassVisitor;
 9    import org.objectweb.asm.FieldVisitor;
 10    import org.objectweb.asm.Label;
 11    import org.objectweb.asm.MethodVisitor;
 12    import org.objectweb.asm.Type;
 13    import org.objectweb.asm.signature.SignatureReader;
 14    import org.objectweb.asm.signature.SignatureVisitor;
 15   
 16    import java.util.ArrayList;
 17    import java.util.HashMap;
 18    import java.util.List;
 19    import java.util.Map;
 20   
 21    public class PMDASMVisitor implements ClassVisitor {
 22   
 23    private Map packages = new HashMap();
 24   
 25    private AnnotationVisitor annotationVisitor = new PMDAnnotationVisitor(this);
 26   
 27    private FieldVisitor fieldVisitor = new PMDFieldVisitor(this);
 28   
 29    private SignatureVisitor sigVisitor = new PMDSignatureVisitor(this);
 30   
 31    private MethodVisitor methodVisitor = new PMDMethodVisitor(this);
 32   
 33    public List innerClasses;
 34   
 35  3 public Map getPackages() {
 36  3 return packages;
 37    }
 38   
 39  3 public List getInnerClasses() {
 40  3 return innerClasses;
 41    }
 42   
 43  23 private String parseClassName(String name) {
 44  23 if (name == null) {
 45  0 return null;
 46    }
 47   
 48  23 String className = name;
 49  23 int n = name.lastIndexOf('/');
 50  23 if (n > -1) {
 51  23 className = name.substring(n + 1);
 52    }
 53  23 name = name.replace('/', '.');
 54  23 packages.put(className, name);
 55  23 n = className.indexOf('$');
 56  23 if (n > -1) {
 57    //TODO I don't think the first one, with Class$Inner is needed - come back and check
 58  2 packages.put(className.substring(n + 1), name);
 59  2 packages.put(className.replace('$', '.'), name);
 60    }
 61   
 62  23 return name;
 63    }
 64   
 65  13 private void parseClassName(String[] names) {
 66  13 if (names != null) {
 67  4 for (int i = 0; i < names.length; i++) {
 68  1 parseClassName(names[i]);
 69    }
 70    }
 71    }
 72   
 73  6 private void extractSignature(String sig) {
 74  6 if (sig != null) {
 75  0 new SignatureReader(sig).accept(sigVisitor);
 76    }
 77    }
 78   
 79    /* Start ClassVisitor implementations */
 80   
 81  4 public void visit(int version, int access, String name, String sig, String superName, String[] interfaces) {
 82  4 parseClassName(name);
 83  4 parseClassName(interfaces);
 84  4 if (sig != null) {
 85  0 extractSignature(sig);
 86    }
 87    }
 88   
 89  0 public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
 90  0 addType(Type.getType(desc));
 91  0 return annotationVisitor;
 92    }
 93   
 94  0 public FieldVisitor visitField(int access, String name, String desc, String sig, Object value) {
 95  0 if (sig != null) {
 96  0 extractSignature(sig);
 97    }
 98   
 99  0 addType(Type.getType(desc));
 100  0 if (value instanceof Type) {
 101  0 addType((Type) value);
 102    }
 103  0 return fieldVisitor;
 104    }
 105   
 106  9 public MethodVisitor visitMethod(int access, String name, String desc, String sig, String[] exceptions) {
 107  9 if (sig != null) {
 108  0 extractSignature(sig);
 109    }
 110  9 addMethodDesc(desc);
 111  9 parseClassName(exceptions);
 112  9 return methodVisitor;
 113    }
 114   
 115  4 public void visitSource(String source, String debug) {
 116    }
 117   
 118  2 public void visitInnerClass(String name, String outerName, String innerName, int access) {
 119  2 if (innerClasses == null) {
 120  1 innerClasses = new ArrayList();
 121    }
 122  2 if (!innerClasses.contains(name.replace('/', '.'))) {
 123  1 innerClasses.add(name.replace('/', '.'));
 124    }
 125  2 packages.put(innerName, name.replace('/', '.'));
 126    }
 127   
 128  0 public void visitOuterClass(String owner, String name, String desc) {
 129    }
 130   
 131  4 public void visitEnd() {
 132    }
 133   
 134  15 private void addMethodDesc(String desc) {
 135  15 addTypes(desc);
 136  15 addType(Type.getReturnType(desc));
 137    }
 138   
 139  15 private void addTypes(String desc) {
 140  15 Type[] types = Type.getArgumentTypes(desc);
 141  15 for (int i = 0; i < types.length; i++) {
 142  3 addType(types[i]);
 143    }
 144    }
 145   
 146  18 private void addType(Type t) {
 147  18 switch (t.getSort()) {
 148  0 case Type.ARRAY:
 149  0 addType(t.getElementType());
 150  0 break;
 151  10 case Type.OBJECT:
 152  10 parseClassName(t.getClassName().replace('.', '/'));
 153  10 break;
 154    }
 155    }
 156   
 157  0 public void visitAttribute(Attribute attr) {
 158    }
 159   
 160    /*
 161    * Start visitors
 162    */
 163   
 164    private static class PMDFieldVisitor implements FieldVisitor {
 165   
 166    private PMDASMVisitor parent;
 167   
 168  3 public PMDFieldVisitor(PMDASMVisitor visitor) {
 169  3 parent = visitor;
 170    }
 171   
 172  0 public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
 173  0 parent.addType(Type.getType(desc));
 174  0 return parent.annotationVisitor;
 175    }
 176   
 177  0 public void visitAttribute(Attribute attr) {
 178    }
 179   
 180  0 public void visitEnd() {
 181    }
 182    }
 183   
 184    private static class PMDAnnotationVisitor implements AnnotationVisitor {
 185    private PMDASMVisitor parent;
 186   
 187  3 public PMDAnnotationVisitor(PMDASMVisitor visitor) {
 188  3 parent = visitor;
 189    }
 190   
 191  0 public AnnotationVisitor visitAnnotation(String name, String desc) {
 192  0 parent.addType(Type.getType(desc));
 193  0 return this;
 194    }
 195   
 196  0 public void visitEnum(String name, String desc, String value) {
 197  0 parent.addType(Type.getType(desc));
 198    }
 199   
 200  0 public AnnotationVisitor visitArray(String name) {
 201  0 return this;
 202    }
 203   
 204  0 public void visitEnd() {
 205    }
 206   
 207  0 public void visit(String name, Object value) {
 208  0 if (value instanceof Type) {
 209  0 parent.addType((Type) value);
 210    }
 211    }
 212    }
 213   
 214    private static class PMDSignatureVisitor implements SignatureVisitor {
 215    private PMDASMVisitor parent;
 216   
 217  3 public PMDSignatureVisitor(PMDASMVisitor visitor) {
 218  3 this.parent = visitor;
 219    }
 220   
 221  0 public void visitFormalTypeParameter(String name) {
 222    }
 223   
 224  0 public SignatureVisitor visitClassBound() {
 225  0 return this;
 226    }
 227   
 228  0 public SignatureVisitor visitInterfaceBound() {
 229  0 return this;
 230    }
 231   
 232  0 public SignatureVisitor visitSuperclass() {
 233  0 return this;
 234    }
 235   
 236  0 public SignatureVisitor visitInterface() {
 237  0 return this;
 238    }
 239   
 240  0 public SignatureVisitor visitParameterType() {
 241  0 return this;
 242    }
 243   
 244  0 public SignatureVisitor visitReturnType() {
 245  0 return this;
 246    }
 247   
 248  0 public SignatureVisitor visitExceptionType() {
 249  0 return this;
 250    }
 251   
 252  0 public void visitBaseType(char descriptor) {
 253    }
 254   
 255  0 public void visitTypeVariable(String name) {
 256    }
 257   
 258  0 public SignatureVisitor visitArrayType() {
 259  0 return this;
 260    }
 261   
 262  0 public void visitClassType(String name) {
 263  0 parent.parseClassName(name);
 264    }
 265   
 266  0 public void visitInnerClassType(String name) {
 267  0 parent.parseClassName(name);
 268    }
 269   
 270  0 public void visitTypeArgument() {
 271    }
 272   
 273  0 public SignatureVisitor visitTypeArgument(char wildcard) {
 274  0 return this;
 275    }
 276   
 277  0 public void visitEnd() {
 278    }
 279    }
 280   
 281    private static class PMDMethodVisitor implements MethodVisitor {
 282    private PMDASMVisitor parent;
 283   
 284  3 public PMDMethodVisitor(PMDASMVisitor visitor) {
 285  3 parent = visitor;
 286    }
 287   
 288  0 public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) {
 289  0 parent.addType(Type.getType(desc));
 290  0 return parent.annotationVisitor;
 291    }
 292   
 293  0 public AnnotationVisitor visitAnnotation(String name, String desc) {
 294  0 parent.addType(Type.getType(desc));
 295  0 return parent.annotationVisitor;
 296    }
 297   
 298  2 public void visitTypeInsn(int opcode, String desc) {
 299  2 if (desc.charAt(0) == '[') {
 300  0 parent.addType(Type.getType(desc));
 301    } else {
 302  2 parent.parseClassName(desc);
 303    }
 304    }
 305   
 306  0 public void visitFieldInsn(int opcode, String owner, String name, String desc) {
 307  0 parent.parseClassName(owner);
 308  0 parent.addType(Type.getType(desc));
 309    }
 310   
 311  6 public void visitMethodInsn(int opcode, String owner, String name, String desc) {
 312  6 parent.parseClassName(owner);
 313  6 parent.addMethodDesc(desc);
 314    }
 315   
 316    /**
 317    * the constant to be loaded on the stack. This parameter must be a non null
 318    * Integer, a Float, a Long, a Double a String (or a Type for .class
 319    * constants, for classes whose version is 49.0 or more).
 320    *
 321    * @see org.objectweb.asm.MethodVisitor#visitLdcInsn(java.lang.Object)
 322    */
 323  0 public void visitLdcInsn(Object cst) {
 324  0 if (cst instanceof Type) {
 325  0 parent.addType((Type) cst);
 326  0 } else if (cst instanceof String) {
 327  0 parent.parseClassName((String) cst);
 328    }
 329    }
 330  0 public void visitMultiANewArrayInsn(String desc, int dims) {
 331  0 parent.addType(Type.getType(desc));
 332    }
 333   
 334  6 public void visitLocalVariable(String name, String desc, String sig, Label start, Label end, int index) {
 335  6 parent.extractSignature(sig);
 336    }
 337   
 338  4 public void visitCode() {
 339    }
 340   
 341  0 public void visitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack) {
 342    }
 343   
 344  5 public void visitInsn(int opcode) {
 345    }
 346   
 347  0 public void visitIntInsn(int opcode, int operand) {
 348    }
 349   
 350  4 public void visitVarInsn(int opcode, int var) {
 351    }
 352   
 353  0 public void visitJumpInsn(int opcode, Label label) {
 354    }
 355   
 356  9 public void visitLabel(Label label) {
 357    }
 358   
 359  0 public void visitIincInsn(int var, int increment) {
 360    }
 361   
 362  0 public void visitTableSwitchInsn(int min, int max, Label dflt, Label[] labels) {
 363    }
 364   
 365  0 public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
 366    }
 367   
 368  0 public void visitTryCatchBlock(Label start, Label end, Label handler, String type) {
 369  0 parent.parseClassName(type);
 370    }
 371   
 372  5 public void visitLineNumber(int line, Label start) {
 373    }
 374   
 375  4 public void visitMaxs(int maxStack, int maxLocals) {
 376    }
 377   
 378  0 public AnnotationVisitor visitAnnotationDefault() {
 379  0 return parent.annotationVisitor;
 380    }
 381   
 382  0 public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
 383  0 parent.addType(Type.getType(desc));
 384  0 return parent.annotationVisitor;
 385    }
 386   
 387  9 public void visitEnd() {
 388    }
 389   
 390  0 public void visitAttribute(Attribute attr) {
 391    }
 392   
 393    }
 394    }