ClassAnalyzer.java

    1/*******************************************************************************
    2 * Copyright (c) 2009, 2010 Mountainminds GmbH & Co. KG and Contributors
    3 * All rights reserved. This program and the accompanying materials
    4 * are made available under the terms of the Eclipse Public License v1.0
    5 * which accompanies this distribution, and is available at
    6 * http://www.eclipse.org/legal/epl-v10.html
    7 *
    8 * Contributors:
    9 *    Marc R. Hoffmann - initial API and implementation
   10 *    
   11 * $Id: $
   12 *******************************************************************************/
   13package org.jacoco.core.instr;
   14
   15import org.jacoco.core.data.IClassStructureVisitor;
   16import org.jacoco.core.data.IMethodStructureVisitor;
   17import org.objectweb.asm.AnnotationVisitor;
   18import org.objectweb.asm.Attribute;
   19import org.objectweb.asm.ClassVisitor;
   20import org.objectweb.asm.FieldVisitor;
   21import org.objectweb.asm.MethodVisitor;
   22import org.objectweb.asm.Opcodes;
   23
   24/**
   25 * A {@link ClassVisitor} that analyzes the structure of a class.
   26 * 
   27 * @author Marc R. Hoffmann
   28 * @version $Revision: $
   29 */
   30public class ClassAnalyzer extends BlockClassAdapter {
   31
   32    private final IClassStructureVisitor structureVisitor;
   33
   34    /**
   35     * Creates a new analyzer that reports to the given
   36     * {@link IClassStructureVisitor} instance.
   37     * 
   38     * @param structureVisitor
   39     *            consumer for class structure output
   40     */
   41    public ClassAnalyzer(final IClassStructureVisitor structureVisitor) {
   42        this.structureVisitor = structureVisitor;
   43    }
   44
   45    public void visit(final int version, final int access, final String name,
   46            final String signature, final String superName,
   47            final String[] interfaces) {
   48        structureVisitor.visit(name, signature, superName, interfaces);
   49    }
   50
   51    public void visitSource(final String source, final String debug) {
   52        if (source != null) {
   53            structureVisitor.visitSourceFile(source);
   54        }
   55    }
   56
   57    @Override
   58    protected IBlockMethodVisitor visitNonAbstractMethod(final int access,
   59            final String name, final String desc, final String signature,
   60            final String[] exceptions) {
   61
   62        // TODO: Use filter hook
   63        if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
   64            return null;
   65        }
   66
   67        final IMethodStructureVisitor structure = structureVisitor
   68                .visitMethodStructure(name, desc, signature);
   69        return new MethodAnalyzer(structure);
   70    }
   71
   72    @Override
   73    protected MethodVisitor visitAbstractMethod(final int access,
   74            final String name, final String desc, final String signature,
   75            final String[] exceptions) {
   76        return null;
   77    }
   78
   79    public void visitEnd() {
   80        structureVisitor.visitEnd();
   81    }
   82
   83    // Ignored methods:
   84
   85    public AnnotationVisitor visitAnnotation(final String desc,
   86            final boolean visible) {
   87        return null;
   88    }
   89
   90    public FieldVisitor visitField(final int access, final String name,
   91            final String desc, final String signature, final Object value) {
   92        return null;
   93    }
   94
   95    public void visitInnerClass(final String name, final String outerName,
   96            final String innerName, final int access) {
   97    }
   98
   99    public void visitOuterClass(final String owner, final String name,
  100            final String desc) {
  101    }
  102
  103    public void visitAttribute(final Attribute attr) {
  104    }
  105
  106}