ClassAnalyzer.java

    1/*******************************************************************************
    2 * Copyright (c) 2009 Mountainminds GmbH & Co. KG and others
    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 visitSource(final String source, final String debug) {
   46        if (source != null) {
   47            structureVisitor.visitSourceFile(source);
   48        }
   49    }
   50
   51    @Override
   52    protected IBlockMethodVisitor visitNonAbstractMethod(final int access,
   53            final String name, final String desc, final String signature,
   54            final String[] exceptions) {
   55
   56        // TODO: Use filter hook
   57        if ((access & Opcodes.ACC_SYNTHETIC) != 0) {
   58            return null;
   59        }
   60
   61        final IMethodStructureVisitor structure = structureVisitor
   62                .visitMethodStructure(name, desc, signature);
   63        return new MethodAnalyzer(structure);
   64    }
   65
   66    @Override
   67    protected MethodVisitor visitAbstractMethod(final int access,
   68            final String name, final String desc, final String signature,
   69            final String[] exceptions) {
   70        return null;
   71    }
   72
   73    public void visitEnd() {
   74        structureVisitor.visitEnd();
   75    }
   76
   77    // Ignored methods:
   78
   79    public void visit(final int version, final int access, final String name,
   80            final String signature, final String superName,
   81            final String[] interfaces) {
   82    }
   83
   84    public AnnotationVisitor visitAnnotation(final String desc,
   85            final boolean visible) {
   86        return null;
   87    }
   88
   89    public FieldVisitor visitField(final int access, final String name,
   90            final String desc, final String signature, final Object value) {
   91        return null;
   92    }
   93
   94    public void visitInnerClass(final String name, final String outerName,
   95            final String innerName, final int access) {
   96    }
   97
   98    public void visitOuterClass(final String owner, final String name,
   99            final String desc) {
  100    }
  101
  102    public void visitAttribute(final Attribute attr) {
  103    }
  104
  105}