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