diff options
author | Evgeny Mandrikov <138671+Godin@users.noreply.github.com> | 2021-01-05 19:37:50 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-05 19:37:50 +0100 |
commit | e859274c57f4bd28cbe34d3048682e5ab74e7a3d (patch) | |
tree | 015a30a843264addbc66225bac8beed889b2da6a /org.jacoco.core/src/org/jacoco/core/internal/analysis | |
parent | f72c2c865fa7c975debb1b3156120501843f5c74 (diff) | |
download | jacoco-e859274c57f4bd28cbe34d3048682e5ab74e7a3d.tar.gz |
Update filter for unsafe cast operator for Kotlin 1.4 (#1143)
Diffstat (limited to 'org.jacoco.core/src/org/jacoco/core/internal/analysis')
-rw-r--r-- | org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinUnsafeCastOperatorFilter.java | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinUnsafeCastOperatorFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinUnsafeCastOperatorFilter.java index 3bfc27b0..f4aaa7f1 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinUnsafeCastOperatorFilter.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinUnsafeCastOperatorFilter.java @@ -24,26 +24,30 @@ import org.objectweb.asm.tree.MethodNode; */ public final class KotlinUnsafeCastOperatorFilter implements IFilter { - private static final String KOTLIN_TYPE_CAST_EXCEPTION = "kotlin/TypeCastException"; - public void filter(final MethodNode methodNode, final IFilterContext context, final IFilterOutput output) { + if (!KotlinGeneratedFilter.isKotlinClass(context)) { + return; + } final Matcher matcher = new Matcher(); for (final AbstractInsnNode i : methodNode.instructions) { - matcher.match(i, output); + matcher.match("kotlin/TypeCastException", i, output); + // Since Kotlin 1.4.0: + matcher.match("java/lang/NullPointerException", i, output); } } private static class Matcher extends AbstractMatcher { - public void match(final AbstractInsnNode start, - final IFilterOutput output) { + public void match(final String exceptionType, + final AbstractInsnNode start, final IFilterOutput output) { - if (Opcodes.IFNONNULL != start.getOpcode()) { + if (Opcodes.DUP != start.getOpcode()) { return; } cursor = start; - - nextIsType(Opcodes.NEW, KOTLIN_TYPE_CAST_EXCEPTION); + nextIs(Opcodes.IFNONNULL); + final JumpInsnNode jumpInsnNode = (JumpInsnNode) cursor; + nextIsType(Opcodes.NEW, exceptionType); nextIs(Opcodes.DUP); nextIs(Opcodes.LDC); if (cursor == null) { @@ -54,13 +58,13 @@ public final class KotlinUnsafeCastOperatorFilter implements IFilter { .startsWith("null cannot be cast to non-null type"))) { return; } - nextIsInvoke(Opcodes.INVOKESPECIAL, KOTLIN_TYPE_CAST_EXCEPTION, - "<init>", "(Ljava/lang/String;)V"); + nextIsInvoke(Opcodes.INVOKESPECIAL, exceptionType, "<init>", + "(Ljava/lang/String;)V"); nextIs(Opcodes.ATHROW); if (cursor == null) { return; } - if (cursor.getNext() != ((JumpInsnNode) start).label) { + if (cursor.getNext() != jumpInsnNode.label) { return; } |