diff options
author | Evgeny Mandrikov <Godin@users.noreply.github.com> | 2017-05-09 19:45:34 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-09 19:45:34 +0200 |
commit | c63563d1955934b5d4593c6d057351fc2dd008de (patch) | |
tree | cf568377a095ab149642ed2b30d111eb08a1214f /org.jacoco.core/src/org/jacoco/core/internal/analysis | |
parent | c24df15ef7c3cd0d65c1e61768b54294f18cf857 (diff) | |
download | jacoco-c63563d1955934b5d4593c6d057351fc2dd008de.tar.gz |
Add filter for private empty constructors that do not have arguments (#529)
Diffstat (limited to 'org.jacoco.core/src/org/jacoco/core/internal/analysis')
3 files changed, 66 insertions, 5 deletions
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 ee051436..8e07e56f 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 @@ -23,6 +23,7 @@ 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; +import org.jacoco.core.internal.analysis.filter.PrivateEmptyNoArgConstructorFilter; import org.jacoco.core.internal.analysis.filter.SynchronizedFilter; import org.jacoco.core.internal.analysis.filter.SyntheticFilter; import org.jacoco.core.internal.analysis.filter.TryWithResourcesEcjFilter; @@ -48,7 +49,7 @@ public class MethodAnalyzer extends MethodProbesVisitor private static final IFilter[] FILTERS = new IFilter[] { new EnumFilter(), new SyntheticFilter(), new SynchronizedFilter(), new TryWithResourcesJavacFilter(), new TryWithResourcesEcjFilter(), - new LombokGeneratedFilter() }; + new PrivateEmptyNoArgConstructorFilter(), new LombokGeneratedFilter() }; private final String className; diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/AbstractMatcher.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/AbstractMatcher.java index e4958bdb..50a295de 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/AbstractMatcher.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/AbstractMatcher.java @@ -73,11 +73,16 @@ abstract class AbstractMatcher { if (cursor == null) { return; } - do { - cursor = cursor.getNext(); - } while (cursor != null && (cursor.getType() == AbstractInsnNode.FRAME + cursor = cursor.getNext(); + skipNonOpcodes(); + } + + final void skipNonOpcodes() { + while (cursor != null && (cursor.getType() == AbstractInsnNode.FRAME || cursor.getType() == AbstractInsnNode.LABEL - || cursor.getType() == AbstractInsnNode.LINE)); + || cursor.getType() == AbstractInsnNode.LINE)) { + cursor = cursor.getNext(); + } } } diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/PrivateEmptyNoArgConstructorFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/PrivateEmptyNoArgConstructorFilter.java new file mode 100644 index 00000000..9e1bd43c --- /dev/null +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/PrivateEmptyNoArgConstructorFilter.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * 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.Opcodes; +import org.objectweb.asm.tree.MethodInsnNode; +import org.objectweb.asm.tree.MethodNode; +import org.objectweb.asm.tree.VarInsnNode; + +/** + * Filters private empty constructors that do not have arguments. + */ +public final class PrivateEmptyNoArgConstructorFilter implements IFilter { + + public void filter(final String className, final String superClassName, + final MethodNode methodNode, final IFilterOutput output) { + if ((methodNode.access & Opcodes.ACC_PRIVATE) != 0 + && "<init>".equals(methodNode.name) + && "()V".equals(methodNode.desc) + && new Matcher().match(methodNode, superClassName)) { + output.ignore(methodNode.instructions.getFirst(), + methodNode.instructions.getLast()); + } + } + + private static class Matcher extends AbstractMatcher { + private boolean match(final MethodNode methodNode, + final String superClassName) { + cursor = methodNode.instructions.getFirst(); + skipNonOpcodes(); + if (cursor.getOpcode() != Opcodes.ALOAD + || ((VarInsnNode) cursor).var != 0) { + return false; + } + nextIs(Opcodes.INVOKESPECIAL); + MethodInsnNode m = (MethodInsnNode) cursor; + if (m != null && superClassName.equals(m.owner) + && "<init>".equals(m.name) && ("()V").equals(m.desc)) { + nextIs(Opcodes.RETURN); + return cursor != null; + } + return false; + } + } + +} |