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}