diff options
author | Evgeny Mandrikov <138671+Godin@users.noreply.github.com> | 2019-06-03 13:11:50 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-03 13:11:50 +0200 |
commit | b7efb625bbd13b92f2c74457c9abfb5edeaa7e43 (patch) | |
tree | 5dc0904c14510b057392a5ce4dfa3051b76f18ad /org.jacoco.core/src/org/jacoco/core/internal | |
parent | be17bad87e3a461b89d634e9bd76298cc1ec1a30 (diff) | |
download | jacoco-b7efb625bbd13b92f2c74457c9abfb5edeaa7e43.tar.gz |
Filter unreachable branches in Kotlin open functions with default arguments (#887)
Diffstat (limited to 'org.jacoco.core/src/org/jacoco/core/internal')
-rw-r--r-- | org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinDefaultArgumentsFilter.java | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinDefaultArgumentsFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinDefaultArgumentsFilter.java index ef198447..34f9562c 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinDefaultArgumentsFilter.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinDefaultArgumentsFilter.java @@ -18,6 +18,7 @@ import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.JumpInsnNode; +import org.objectweb.asm.tree.LdcInsnNode; import org.objectweb.asm.tree.MethodNode; import org.objectweb.asm.tree.VarInsnNode; @@ -67,6 +68,27 @@ public final class KotlinDefaultArgumentsFilter implements IFilter { final IFilterOutput output) { cursor = methodNode.instructions.getFirst(); + nextIs(Opcodes.IFNULL); + nextIsType(Opcodes.NEW, "java/lang/UnsupportedOperationException"); + nextIs(Opcodes.DUP); + nextIs(Opcodes.LDC); + if (cursor == null + || !(((LdcInsnNode) cursor).cst instanceof String) + || !(((String) ((LdcInsnNode) cursor).cst).startsWith( + "Super calls with default arguments not supported in this target"))) { + cursor = null; + } + nextIsInvoke(Opcodes.INVOKESPECIAL, + "java/lang/UnsupportedOperationException", "<init>", + "(Ljava/lang/String;)V"); + nextIs(Opcodes.ATHROW); + if (cursor != null) { + output.ignore(methodNode.instructions.getFirst(), cursor); + next(); + } else { + cursor = methodNode.instructions.getFirst(); + } + final Set<AbstractInsnNode> ignore = new HashSet<AbstractInsnNode>(); final int maskVar = Type.getMethodType(methodNode.desc) .getArgumentTypes().length - 2; |