From e94c7af58000b3421bc63a252ee054c08a863568 Mon Sep 17 00:00:00 2001 From: Evgeny Mandrikov Date: Mon, 3 Apr 2017 19:35:02 +0200 Subject: Use new filtering API for existing filter of methods in enums (#512) --- .../core/internal/analysis/ClassAnalyzer.java | 29 +------------ .../core/internal/analysis/MethodAnalyzer.java | 20 +++++++-- .../core/internal/analysis/filter/EnumFilter.java | 48 ++++++++++++++++++++++ .../core/internal/analysis/filter/IFilter.java | 9 +++- .../analysis/filter/LombokGeneratedFilter.java | 4 +- .../analysis/filter/SynchronizedFilter.java | 3 +- .../internal/analysis/filter/SyntheticFilter.java | 3 +- 7 files changed, 79 insertions(+), 37 deletions(-) create mode 100644 org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/EnumFilter.java (limited to 'org.jacoco.core/src/org') 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 true 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 * null 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 values and valueOf 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(), -- cgit v1.2.3