+ * class Example {
+ * void example(boolean b) {
+ * ...
+ * assert b : "message";
+ * ...
+ * }
+ * }
+ *
+ */
+ @Test
+ public void should_filter_static_initializer() {
+ context.className = "Example";
+ final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION,
+ Opcodes.ACC_STATIC, "
+ * class Example {
+ * static final f;
+ *
+ * static {
+ * f = !Example.class.desiredAssertionStatus();
+ * }
+ * }
+ *
+ */
+ @Test
+ public void should_not_filter_static_initializer_when_field_name_does_not_match() {
+ context.className = "Example";
+ final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION,
+ Opcodes.ACC_STATIC, "
+ * class Example {
+ * void example(boolean b) {
+ * ...
+ * assert b : "message";
+ * ...
+ * }
+ * }
+ *
+ */
+ @Test
+ public void should_filter_assert() {
+ context.className = "Example";
+ final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION, 0,
+ "example", "()V", null, null);
+
+ m.visitInsn(Opcodes.NOP);
+ m.visitFieldInsn(Opcodes.GETSTATIC, "Example", "$assertionsDisabled",
+ "Z");
+ final Label label = new Label();
+ m.visitJumpInsn(Opcodes.IFNE, label);
+ final Range range = new Range(m.instructions.getLast(),
+ m.instructions.getLast());
+ m.visitVarInsn(Opcodes.ILOAD, 1);
+ m.visitJumpInsn(Opcodes.IFNE, label);
+ m.visitTypeInsn(Opcodes.NEW, "java/lang/AssertionError");
+ m.visitInsn(Opcodes.DUP);
+ m.visitLdcInsn("message");
+ m.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/AssertionError",
+ "null
.
+ */
+ final void nextIsField(final int opcode, final String owner,
+ final String name, final String descriptor) {
+ nextIs(opcode);
+ if (cursor == null) {
+ return;
+ }
+ final FieldInsnNode f = (FieldInsnNode) cursor;
+ if (owner.equals(f.owner) && name.equals(f.name)
+ && descriptor.equals(f.desc)) {
+ return;
+ }
+ cursor = null;
+ }
+
final void nextIsVar(final int opcode, final String name) {
nextIs(opcode);
if (cursor == null) {
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/AssertFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/AssertFilter.java
new file mode 100644
index 0000000000..044a672932
--- /dev/null
+++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/AssertFilter.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2021 Mountainminds GmbH & Co. KG and Contributors
+ * This program and the accompanying materials are made available under
+ * the terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Evgeny Mandrikov - initial API and implementation
+ *
+ *******************************************************************************/
+package org.jacoco.core.internal.analysis.filter;
+
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+
+/**
+ * Filters code that is generated for an assert
statement.
+ */
+final class AssertFilter implements IFilter {
+
+ public void filter(final MethodNode methodNode,
+ final IFilterContext context, final IFilterOutput output) {
+ final Matcher matcher = new Matcher();
+ if ("assert
+ statement is filtered out during generation of report
+ (GitHub #1196).NullPointerException
during filtering