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}