1e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/*******************************************************************************
2b9d1b54e300318b470d9fedccc69d75187016444Evgeny Mandrikov * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors
3e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * All rights reserved. This program and the accompanying materials
4e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * are made available under the terms of the Eclipse Public License v1.0
5e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * which accompanies this distribution, and is available at
6e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * http://www.eclipse.org/legal/epl-v10.html
7e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *
8e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Contributors:
9e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *    Marc R. Hoffmann - initial API and implementation
10e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *
11e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *******************************************************************************/
12e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovpackage org.jacoco.core.internal.analysis;
13e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
14e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport org.jacoco.core.analysis.IMethodCoverage;
151962cf59bc403a27f68c55b39bb833b00fa386a0Evgeny Mandrikovimport org.jacoco.core.internal.analysis.filter.Filters;
1632e3a05444847ecde19cef575e57fec51c85d085Marc R. Hoffmannimport org.jacoco.core.internal.flow.ClassProbesVisitor;
1732e3a05444847ecde19cef575e57fec51c85d085Marc R. Hoffmannimport org.jacoco.core.internal.flow.MethodProbesVisitor;
18e048201f115d862e1b99e78249ef9e720212c201Marc R. Hoffmannimport org.jacoco.core.internal.instr.InstrSupport;
19e048201f115d862e1b99e78249ef9e720212c201Marc R. Hoffmannimport org.objectweb.asm.FieldVisitor;
20e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
21e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/**
22e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Analyzes the structure of a class.
23e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */
2432e3a05444847ecde19cef575e57fec51c85d085Marc R. Hoffmannpublic class ClassAnalyzer extends ClassProbesVisitor {
25e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
26f4622217085198f3ae42906934026961b29d1111Marc R. Hoffmann	private final ClassCoverageImpl coverage;
270bac737c1bca289341243bfb15e7399170383a21Marc R. Hoffmann	private final boolean[] probes;
28e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	private final StringPool stringPool;
29e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
30e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	/**
31e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * Creates a new analyzer that builds coverage data for a class.
32e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *
33f4622217085198f3ae42906934026961b29d1111Marc R. Hoffmann	 * @param coverage
34f4622217085198f3ae42906934026961b29d1111Marc R. Hoffmann	 *            coverage node for the analyzed class data
3527e32e433ba0ac1fdec9290d3454d5b369c969ccMarc R. Hoffmann	 * @param probes
36e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *            execution data for this class or <code>null</code>
37e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 * @param stringPool
38e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 *            shared pool to minimize the number of {@link String} instances
39e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	 */
40f4622217085198f3ae42906934026961b29d1111Marc R. Hoffmann	public ClassAnalyzer(final ClassCoverageImpl coverage,
4160c33d63e75c1b0a5da9bd58be1f0b5434240220Marc R. Hoffmann			final boolean[] probes, final StringPool stringPool) {
42f4622217085198f3ae42906934026961b29d1111Marc R. Hoffmann		this.coverage = coverage;
4327e32e433ba0ac1fdec9290d3454d5b369c969ccMarc R. Hoffmann		this.probes = probes;
44e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		this.stringPool = stringPool;
45e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
46e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
4732e3a05444847ecde19cef575e57fec51c85d085Marc R. Hoffmann	@Override
48e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void visit(final int version, final int access, final String name,
49e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			final String signature, final String superName,
50e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			final String[] interfaces) {
51f4622217085198f3ae42906934026961b29d1111Marc R. Hoffmann		coverage.setSignature(stringPool.get(signature));
52f4622217085198f3ae42906934026961b29d1111Marc R. Hoffmann		coverage.setSuperName(stringPool.get(superName));
53f4622217085198f3ae42906934026961b29d1111Marc R. Hoffmann		coverage.setInterfaces(stringPool.get(interfaces));
54e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
55e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
5632e3a05444847ecde19cef575e57fec51c85d085Marc R. Hoffmann	@Override
57e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void visitSource(final String source, final String debug) {
58f4622217085198f3ae42906934026961b29d1111Marc R. Hoffmann		coverage.setSourceFileName(stringPool.get(source));
59e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
60e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
6132e3a05444847ecde19cef575e57fec51c85d085Marc R. Hoffmann	@Override
6232e3a05444847ecde19cef575e57fec51c85d085Marc R. Hoffmann	public MethodProbesVisitor visitMethod(final int access, final String name,
6332e3a05444847ecde19cef575e57fec51c85d085Marc R. Hoffmann			final String desc, final String signature, final String[] exceptions) {
64e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
65e048201f115d862e1b99e78249ef9e720212c201Marc R. Hoffmann		InstrSupport.assertNotInstrumented(name, coverage.getName());
66e048201f115d862e1b99e78249ef9e720212c201Marc R. Hoffmann
67e94c7af58000b3421bc63a252ee054c08a863568Evgeny Mandrikov		return new MethodAnalyzer(coverage.getName(), coverage.getSuperName(),
68e94c7af58000b3421bc63a252ee054c08a863568Evgeny Mandrikov				stringPool.get(name), stringPool.get(desc),
691962cf59bc403a27f68c55b39bb833b00fa386a0Evgeny Mandrikov				stringPool.get(signature), probes, Filters.ALL) {
70e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			@Override
71e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			public void visitEnd() {
72e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov				super.visitEnd();
73e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov				final IMethodCoverage methodCoverage = getCoverage();
74e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov				if (methodCoverage.getInstructionCounter().getTotalCount() > 0) {
75e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov					// Only consider methods that actually contain code
76e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov					coverage.addMethod(methodCoverage);
77e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov				}
78e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			}
79e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		};
80e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
81e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
8232e3a05444847ecde19cef575e57fec51c85d085Marc R. Hoffmann	@Override
83e048201f115d862e1b99e78249ef9e720212c201Marc R. Hoffmann	public FieldVisitor visitField(final int access, final String name,
84e048201f115d862e1b99e78249ef9e720212c201Marc R. Hoffmann			final String desc, final String signature, final Object value) {
85e048201f115d862e1b99e78249ef9e720212c201Marc R. Hoffmann		InstrSupport.assertNotInstrumented(name, coverage.getName());
86e048201f115d862e1b99e78249ef9e720212c201Marc R. Hoffmann		return super.visitField(access, name, desc, signature, value);
87e048201f115d862e1b99e78249ef9e720212c201Marc R. Hoffmann	}
88e048201f115d862e1b99e78249ef9e720212c201Marc R. Hoffmann
89e048201f115d862e1b99e78249ef9e720212c201Marc R. Hoffmann	@Override
90e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	public void visitTotalProbeCount(final int count) {
91e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		// nothing to do
92e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
93e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
94e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov}
95