aboutsummaryrefslogtreecommitdiff
path: root/org.jacoco.core/src/org
diff options
context:
space:
mode:
authorEvgeny Mandrikov <Godin@users.noreply.github.com>2017-04-03 19:35:02 +0200
committerMarc R. Hoffmann <hoffmann@mountainminds.com>2017-04-03 19:35:02 +0200
commite94c7af58000b3421bc63a252ee054c08a863568 (patch)
tree385b540d48297b3b66947e349f61fb2f4cd72030 /org.jacoco.core/src/org
parent7f719c8365b3ac8853cfc8b62fd48d2eabddfc4c (diff)
downloadjacoco-e94c7af58000b3421bc63a252ee054c08a863568.tar.gz
Use new filtering API for existing filter of methods in enums (#512)
Diffstat (limited to 'org.jacoco.core/src/org')
-rw-r--r--org.jacoco.core/src/org/jacoco/core/internal/analysis/ClassAnalyzer.java29
-rw-r--r--org.jacoco.core/src/org/jacoco/core/internal/analysis/MethodAnalyzer.java20
-rw-r--r--org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/EnumFilter.java48
-rw-r--r--org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/IFilter.java9
-rw-r--r--org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/LombokGeneratedFilter.java4
-rw-r--r--org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/SynchronizedFilter.java3
-rw-r--r--org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/SyntheticFilter.java3
7 files changed, 79 insertions, 37 deletions
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/ClassAnalyzer.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/ClassAnalyzer.java
index 38037be5..fa3517b6 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/ClassAnalyzer.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/ClassAnalyzer.java
@@ -63,12 +63,8 @@ public class ClassAnalyzer extends ClassProbesVisitor {
InstrSupport.assertNotInstrumented(name, coverage.getName());
- if (isMethodFiltered(coverage.getName(), coverage.getSuperName(), name,
- desc)) {
- return null;
- }
-
- return new MethodAnalyzer(stringPool.get(name), stringPool.get(desc),
+ return new MethodAnalyzer(coverage.getName(), coverage.getSuperName(),
+ stringPool.get(name), stringPool.get(desc),
stringPool.get(signature), probes) {
@Override
public void visitEnd() {
@@ -82,27 +78,6 @@ public class ClassAnalyzer extends ClassProbesVisitor {
};
}
- /**
- * @return <code>true</code> if method should not be analyzed
- */
- // TODO: Use filter hook in future
- private boolean isMethodFiltered(final String className,
- final String superClassName, final String name, final String desc) {
- if ("java/lang/Enum".equals(superClassName)) {
- // filter out methods that compiler creates for enums
- if ("values".equals(name)
- && ("()[L" + className + ";").equals(desc)) {
- return true;
- }
- if ("valueOf".equals(name)
- && ("(Ljava/lang/String;)L" + className + ";")
- .equals(desc)) {
- return true;
- }
- }
- return false;
- }
-
@Override
public FieldVisitor visitField(final int access, final String name,
final String desc, final String signature, final Object value) {
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/MethodAnalyzer.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/MethodAnalyzer.java
index e5dde709..993fe88a 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/MethodAnalyzer.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/MethodAnalyzer.java
@@ -19,6 +19,7 @@ import java.util.Set;
import org.jacoco.core.analysis.ICounter;
import org.jacoco.core.analysis.IMethodCoverage;
import org.jacoco.core.analysis.ISourceNode;
+import org.jacoco.core.internal.analysis.filter.EnumFilter;
import org.jacoco.core.internal.analysis.filter.IFilter;
import org.jacoco.core.internal.analysis.filter.IFilterOutput;
import org.jacoco.core.internal.analysis.filter.LombokGeneratedFilter;
@@ -42,10 +43,14 @@ import org.objectweb.asm.tree.TryCatchBlockNode;
public class MethodAnalyzer extends MethodProbesVisitor
implements IFilterOutput {
- private static final IFilter[] FILTERS = new IFilter[] {
+ private static final IFilter[] FILTERS = new IFilter[] { new EnumFilter(),
new SyntheticFilter(), new SynchronizedFilter(),
new LombokGeneratedFilter() };
+ private final String className;
+
+ private final String superClassName;
+
private final boolean[] probes;
private final MethodCoverageImpl coverage;
@@ -74,6 +79,10 @@ public class MethodAnalyzer extends MethodProbesVisitor
/**
* New Method analyzer for the given probe data.
*
+ * @param className
+ * class name
+ * @param superClassName
+ * superclass name
* @param name
* method name
* @param desc
@@ -85,9 +94,12 @@ public class MethodAnalyzer extends MethodProbesVisitor
* recorded probe date of the containing class or
* <code>null</code> if the class is not executed at all
*/
- public MethodAnalyzer(final String name, final String desc,
- final String signature, final boolean[] probes) {
+ public MethodAnalyzer(final String className, final String superClassName,
+ final String name, final String desc, final String signature,
+ final boolean[] probes) {
super();
+ this.className = className;
+ this.superClassName = superClassName;
this.probes = probes;
this.coverage = new MethodCoverageImpl(name, desc, signature);
}
@@ -110,7 +122,7 @@ public class MethodAnalyzer extends MethodProbesVisitor
final MethodVisitor methodVisitor) {
this.ignored.clear();
for (final IFilter filter : FILTERS) {
- filter.filter(methodNode, this);
+ filter.filter(className, superClassName, methodNode, this);
}
for (final TryCatchBlockNode n : methodNode.tryCatchBlocks) {
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/EnumFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/EnumFilter.java
new file mode 100644
index 00000000..852008e5
--- /dev/null
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/EnumFilter.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.analysis.filter;
+
+import org.objectweb.asm.tree.MethodNode;
+
+/**
+ * Filters methods <code>values</code> and <code>valueOf</code> that compiler
+ * creates for enums.
+ */
+public final class EnumFilter implements IFilter {
+
+ public void filter(final String className, final String superClassName,
+ final MethodNode methodNode, final IFilterOutput output) {
+ if (isMethodFiltered(className, superClassName, methodNode.name,
+ methodNode.desc)) {
+ output.ignore(methodNode.instructions.getFirst(),
+ methodNode.instructions.getLast());
+ }
+ }
+
+ private boolean isMethodFiltered(final String className,
+ final String superClassName, final String methodName,
+ final String methodDesc) {
+ if ("java/lang/Enum".equals(superClassName)) {
+ if ("values".equals(methodName)
+ && ("()[L" + className + ";").equals(methodDesc)) {
+ return true;
+ }
+ if ("valueOf".equals(methodName)
+ && ("(Ljava/lang/String;)L" + className + ";")
+ .equals(methodDesc)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/IFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/IFilter.java
index c1bab8e6..39cf5c78 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/IFilter.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/IFilter.java
@@ -23,12 +23,17 @@ public interface IFilter {
* This method is called for every method. The filter implementation is
* expected to inspect the provided method and report its result to the
* given {@link IFilterOutput} instance.
- *
+ *
+ * @param className
+ * class name
+ * @param superClassName
+ * superclass name
* @param methodNode
* method to inspect
* @param output
* callback to report filtering results to
*/
- void filter(MethodNode methodNode, IFilterOutput output);
+ void filter(String className, String superClassName, MethodNode methodNode,
+ IFilterOutput output);
}
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/LombokGeneratedFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/LombokGeneratedFilter.java
index 9f23ecd8..571e4641 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/LombokGeneratedFilter.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/LombokGeneratedFilter.java
@@ -21,8 +21,8 @@ import org.objectweb.asm.tree.MethodNode;
*/
public class LombokGeneratedFilter implements IFilter {
- public void filter(final MethodNode methodNode,
- final IFilterOutput output) {
+ public void filter(final String className, final String superClassName,
+ final MethodNode methodNode, final IFilterOutput output) {
if (hasLombokGeneratedAnnotation(methodNode)) {
output.ignore(methodNode.instructions.getFirst(),
methodNode.instructions.getLast());
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/SynchronizedFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/SynchronizedFilter.java
index 65e763d5..655226e7 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/SynchronizedFilter.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/SynchronizedFilter.java
@@ -21,7 +21,8 @@ import org.objectweb.asm.tree.TryCatchBlockNode;
*/
public final class SynchronizedFilter implements IFilter {
- public void filter(MethodNode methodNode, IFilterOutput output) {
+ public void filter(final String className, final String superClassName,
+ final MethodNode methodNode, final IFilterOutput output) {
for (TryCatchBlockNode tryCatch : methodNode.tryCatchBlocks) {
if (tryCatch.type != null) {
continue;
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/SyntheticFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/SyntheticFilter.java
index 540909df..454ec804 100644
--- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/SyntheticFilter.java
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/SyntheticFilter.java
@@ -19,7 +19,8 @@ import org.objectweb.asm.tree.MethodNode;
*/
public final class SyntheticFilter implements IFilter {
- public void filter(MethodNode methodNode, IFilterOutput output) {
+ public void filter(final String className, final String superClassName,
+ final MethodNode methodNode, final IFilterOutput output) {
if ((methodNode.access & Opcodes.ACC_SYNTHETIC) != 0
&& !methodNode.name.startsWith("lambda$")) {
output.ignore(methodNode.instructions.getFirst(),