aboutsummaryrefslogtreecommitdiff
path: root/org.jacoco.core/src/org/jacoco/core/internal/analysis
diff options
context:
space:
mode:
authorEvgeny Mandrikov <Godin@users.noreply.github.com>2017-05-09 19:45:34 +0200
committerGitHub <noreply@github.com>2017-05-09 19:45:34 +0200
commitc63563d1955934b5d4593c6d057351fc2dd008de (patch)
treecf568377a095ab149642ed2b30d111eb08a1214f /org.jacoco.core/src/org/jacoco/core/internal/analysis
parentc24df15ef7c3cd0d65c1e61768b54294f18cf857 (diff)
downloadjacoco-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')
-rw-r--r--org.jacoco.core/src/org/jacoco/core/internal/analysis/MethodAnalyzer.java3
-rw-r--r--org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/AbstractMatcher.java13
-rw-r--r--org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/PrivateEmptyNoArgConstructorFilter.java55
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;
+ }
+ }
+
+}