From 88cdc40e8295ec074d15c215aaf2095c490791b9 Mon Sep 17 00:00:00 2001 From: Evgeny Mandrikov Date: Wed, 6 Jan 2021 10:04:12 +0100 Subject: [PATCH 1/5] (WIP) Upgrade Kotlin to 1.4.20 --- org.jacoco.core.test.validation.kotlin/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.jacoco.core.test.validation.kotlin/pom.xml b/org.jacoco.core.test.validation.kotlin/pom.xml index 69511f3a26..6ffff281e2 100644 --- a/org.jacoco.core.test.validation.kotlin/pom.xml +++ b/org.jacoco.core.test.validation.kotlin/pom.xml @@ -25,7 +25,7 @@ JaCoCo :: Test :: Core :: Validation Kotlin - 1.4.0 + 1.4.20 From 39797bbf709cb006aff6ac0f55da77080fd455de Mon Sep 17 00:00:00 2001 From: Evgeny Mandrikov Date: Wed, 6 Jan 2021 10:55:47 +0100 Subject: [PATCH 2/5] (WIP) Update unit tests --- .../analysis/filter/KotlinCoroutineFilterTest.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/KotlinCoroutineFilterTest.java b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/KotlinCoroutineFilterTest.java index f5847c370e..f96ed78e65 100644 --- a/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/KotlinCoroutineFilterTest.java +++ b/org.jacoco.core.test/src/org/jacoco/core/internal/analysis/filter/KotlinCoroutineFilterTest.java @@ -33,12 +33,11 @@ public void should_filter_suspending_lambdas_generated_by_Kotlin_1_3_30() { context.classAnnotations .add(KotlinGeneratedFilter.KOTLIN_METADATA_DESC); - m.visitLabel(new Label()); - final Range range1 = new Range(); - range1.fromInclusive = m.instructions.getLast(); m.visitMethodInsn(Opcodes.INVOKESTATIC, "kotlin/coroutines/intrinsics/IntrinsicsKt", "getCOROUTINE_SUSPENDED", "()Ljava/lang/Object;", false); + final Range range1 = new Range(); + range1.fromInclusive = m.instructions.getLast(); m.visitVarInsn(Opcodes.ASTORE, 4); m.visitVarInsn(Opcodes.ALOAD, 0); @@ -129,12 +128,11 @@ public void should_filter_suspending_lambdas() { context.classAnnotations .add(KotlinGeneratedFilter.KOTLIN_METADATA_DESC); - m.visitLabel(new Label()); - final Range range1 = new Range(); - range1.fromInclusive = m.instructions.getLast(); m.visitMethodInsn(Opcodes.INVOKESTATIC, "kotlin/coroutines/intrinsics/IntrinsicsKt", "getCOROUTINE_SUSPENDED", "()Ljava/lang/Object;", false); + final Range range1 = new Range(); + range1.fromInclusive = m.instructions.getLast(); m.visitVarInsn(Opcodes.ASTORE, 4); m.visitVarInsn(Opcodes.ALOAD, 0); From 5defbc10ade71fa6c4ca8edba46b224fc7f2563a Mon Sep 17 00:00:00 2001 From: Evgeny Mandrikov Date: Wed, 6 Jan 2021 11:13:26 +0100 Subject: [PATCH 3/5] (WIP) Fix --- .../analysis/filter/KotlinCoroutineFilter.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinCoroutineFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinCoroutineFilter.java index 6d41a80c61..23943ab5f2 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinCoroutineFilter.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinCoroutineFilter.java @@ -20,6 +20,7 @@ import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.JumpInsnNode; import org.objectweb.asm.tree.LdcInsnNode; +import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; import org.objectweb.asm.tree.TableSwitchInsnNode; @@ -67,10 +68,17 @@ private void matchOptimizedTailCall(final MethodNode methodNode, private void match(final MethodNode methodNode, final IFilterOutput output) { - cursor = methodNode.instructions.getFirst(); - nextIsInvoke(Opcodes.INVOKESTATIC, - "kotlin/coroutines/intrinsics/IntrinsicsKt", - "getCOROUTINE_SUSPENDED", "()Ljava/lang/Object;"); + cursor = skipNonOpcodes(methodNode.instructions.getFirst()); + if (cursor == null || cursor.getOpcode() != Opcodes.INVOKESTATIC) { + cursor = null; + } else { + final MethodInsnNode m = (MethodInsnNode) cursor; + if (!"kotlin/coroutines/intrinsics/IntrinsicsKt".equals(m.owner) + || !"getCOROUTINE_SUSPENDED".equals(m.name) + || !"()Ljava/lang/Object;".equals(m.desc)) { + cursor = null; + } + } if (cursor == null) { cursor = skipNonOpcodes(methodNode.instructions.getFirst()); From 2e0c592e43f07657e6d6fc2344c37f20e6059482 Mon Sep 17 00:00:00 2001 From: Evgeny Mandrikov Date: Wed, 6 Jan 2021 17:21:41 +0100 Subject: [PATCH 4/5] (WIP) exclude org.jacoco.core.test.validation.kotlin from builds with JDK 16 and 17 --- org.jacoco.core.test.validation.kotlin/pom.xml | 4 ++++ org.jacoco.core.test.validation/pom.xml | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/org.jacoco.core.test.validation.kotlin/pom.xml b/org.jacoco.core.test.validation.kotlin/pom.xml index 6ffff281e2..0f3cae74a1 100644 --- a/org.jacoco.core.test.validation.kotlin/pom.xml +++ b/org.jacoco.core.test.validation.kotlin/pom.xml @@ -25,6 +25,10 @@ JaCoCo :: Test :: Core :: Validation Kotlin + 1.4.20 diff --git a/org.jacoco.core.test.validation/pom.xml b/org.jacoco.core.test.validation/pom.xml index cbfa9ffef6..00bca5bbab 100644 --- a/org.jacoco.core.test.validation/pom.xml +++ b/org.jacoco.core.test.validation/pom.xml @@ -249,7 +249,12 @@ 16 + ../org.jacoco.core.test.validation.java7 ../org.jacoco.core.test.validation.java8 ../org.jacoco.core.test.validation.java14 @@ -272,7 +277,12 @@ 17 + ../org.jacoco.core.test.validation.java7 ../org.jacoco.core.test.validation.java8 ../org.jacoco.core.test.validation.java14 From 834558954ef3cc19699a3f82212ee2884e741b19 Mon Sep 17 00:00:00 2001 From: Evgeny Mandrikov Date: Fri, 8 Jan 2021 12:05:16 +0100 Subject: [PATCH 5/5] (WIP) Update changelog --- org.jacoco.doc/docroot/doc/changes.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/org.jacoco.doc/docroot/doc/changes.html b/org.jacoco.doc/docroot/doc/changes.html index 5d20c4a687..f35ffaf7af 100644 --- a/org.jacoco.doc/docroot/doc/changes.html +++ b/org.jacoco.doc/docroot/doc/changes.html @@ -30,6 +30,9 @@

New Features

  • Branch added by the Kotlin compiler version 1.4.0 and above for "unsafe" cast operator is filtered out during generation of report (GitHub #1143).
  • +
  • Branches added by the Kotlin compiler version 1.4.20 and above for suspending + lambdas are filtered out during generation of report + (GitHub #1149).
  • Non-functional Changes