diff options
author | Evgeny Mandrikov <138671+Godin@users.noreply.github.com> | 2021-02-21 19:41:48 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-21 19:41:48 +0100 |
commit | 66b5fa9216577bfe86fb29e83b031a3cde10cc08 (patch) | |
tree | a72e203378199ba974088b08346b3b4115e0d50b /org.jacoco.core/src/org/jacoco/core | |
parent | 65953a7c74946bfc6725b71535b1ac8474d5ddcf (diff) | |
download | jacoco-66b5fa9216577bfe86fb29e83b031a3cde10cc08.tar.gz |
Improve filter for Kotlin when-expressions with String (#1156)
Diffstat (limited to 'org.jacoco.core/src/org/jacoco/core')
-rw-r--r-- | org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinWhenStringFilter.java | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinWhenStringFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinWhenStringFilter.java index 37d394f9..5fd20874 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinWhenStringFilter.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinWhenStringFilter.java @@ -74,7 +74,7 @@ public final class KotlinWhenStringFilter implements IFilter { final Set<AbstractInsnNode> replacements = new HashSet<AbstractInsnNode>(); replacements.add(skipNonOpcodes(defaultLabel)); - for (int i = 0; i < hashCodes; i++) { + for (int i = 1; i <= hashCodes; i++) { while (true) { nextIsVar(Opcodes.ALOAD, "s"); nextIs(Opcodes.LDC); @@ -83,18 +83,24 @@ public final class KotlinWhenStringFilter implements IFilter { // jump to next comparison or default case nextIs(Opcodes.IFEQ); final JumpInsnNode jump = (JumpInsnNode) cursor; - // jump to case - nextIs(Opcodes.GOTO); + next(); if (cursor == null) { return; - } - - replacements - .add(skipNonOpcodes(((JumpInsnNode) cursor).label)); - - if (jump.label == defaultLabel) { - // end of comparisons for same hashCode + } else if (cursor.getOpcode() == Opcodes.GOTO) { + // jump to case body + replacements.add( + skipNonOpcodes(((JumpInsnNode) cursor).label)); + if (jump.label == defaultLabel) { + // end of comparisons for same hashCode + break; + } + } else if (i == hashCodes && jump.label == defaultLabel) { + // case body + replacements.add(cursor); + cursor = jump; break; + } else { + return; } } } |