forked from bazelbuild/rules_scala
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add filter for Kotlin default methods (bazelbuild#1012)
- Loading branch information
Showing
6 changed files
with
199 additions
and
1 deletion.
There are no files selected for viewing
27 changes: 27 additions & 0 deletions
27
...alidation.kotlin/src/org/jacoco/core/test/validation/kotlin/KotlinDefaultMethodsTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
/******************************************************************************* | ||
* Copyright (c) 2009, 2020 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.test.validation.kotlin; | ||
|
||
import org.jacoco.core.test.validation.ValidationTestBase; | ||
import org.jacoco.core.test.validation.kotlin.targets.KotlinDefaultMethodsTarget; | ||
|
||
/** | ||
* Test of code coverage in {@link KotlinDefaultMethodsTarget}. | ||
*/ | ||
public class KotlinDefaultMethodsTest extends ValidationTestBase { | ||
|
||
public KotlinDefaultMethodsTest() { | ||
super(KotlinDefaultMethodsTarget.class); | ||
} | ||
|
||
} |
36 changes: 36 additions & 0 deletions
36
...n.kotlin/src/org/jacoco/core/test/validation/kotlin/targets/KotlinDefaultMethodsTarget.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
/******************************************************************************* | ||
* Copyright (c) 2009, 2020 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.test.validation.kotlin.targets | ||
|
||
/** | ||
* This test target contains class implementing interface with default methods. | ||
*/ | ||
object KotlinDefaultMethodsTarget { | ||
|
||
interface I { | ||
fun m1() = Unit // assertNotCovered() | ||
fun m2() = Unit // assertFullyCovered() | ||
fun m3() = Unit // assertNotCovered() | ||
} | ||
|
||
class C : I { // assertFullyCovered() | ||
override fun m1() = Unit // assertFullyCovered() | ||
} | ||
|
||
@JvmStatic | ||
fun main(args: Array<String>) { | ||
C().m1() | ||
C().m2() | ||
} | ||
|
||
} |
86 changes: 86 additions & 0 deletions
86
...ore.test/src/org/jacoco/core/internal/analysis/filter/KotlinDefaultMethodsFilterTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
/******************************************************************************* | ||
* Copyright (c) 2009, 2020 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.jacoco.core.internal.instr.InstrSupport; | ||
import org.junit.Test; | ||
import org.objectweb.asm.Opcodes; | ||
import org.objectweb.asm.tree.MethodNode; | ||
|
||
/** | ||
* Unit test for {@link KotlinDefaultMethodsFilter}. | ||
*/ | ||
public class KotlinDefaultMethodsFilterTest extends FilterTestBase { | ||
|
||
private final IFilter filter = new KotlinDefaultMethodsFilter(); | ||
|
||
@Test | ||
public void should_filter() { | ||
context.classAnnotations | ||
.add(KotlinGeneratedFilter.KOTLIN_METADATA_DESC); | ||
final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION, 0, | ||
"m", "()V", null, null); | ||
m.visitVarInsn(Opcodes.ALOAD, 0); | ||
m.visitMethodInsn(Opcodes.INVOKESTATIC, "Target$DefaultImpls", "m", | ||
"(LTarget;)V", false); | ||
m.visitInsn(Opcodes.RETURN); | ||
|
||
filter.filter(m, context, output); | ||
|
||
assertMethodIgnored(m); | ||
} | ||
|
||
@Test | ||
public void should_not_filter_when_invokestatic_owner_does_not_match() { | ||
context.classAnnotations | ||
.add(KotlinGeneratedFilter.KOTLIN_METADATA_DESC); | ||
final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION, 0, | ||
"m", "()V", null, null); | ||
m.visitVarInsn(Opcodes.ALOAD, 0); | ||
m.visitMethodInsn(Opcodes.INVOKESTATIC, "Target", "m", "(LTarget;)V", | ||
false); | ||
m.visitInsn(Opcodes.RETURN); | ||
|
||
filter.filter(m, context, output); | ||
|
||
assertIgnored(); | ||
} | ||
|
||
@Test | ||
public void should_not_filter_when_instructions_do_not_match() { | ||
context.classAnnotations | ||
.add(KotlinGeneratedFilter.KOTLIN_METADATA_DESC); | ||
final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION, 0, | ||
"m", "()V", null, null); | ||
m.visitInsn(Opcodes.RETURN); | ||
|
||
filter.filter(m, context, output); | ||
|
||
assertIgnored(); | ||
} | ||
|
||
@Test | ||
public void should_not_filter_when_not_kotlin() { | ||
final MethodNode m = new MethodNode(InstrSupport.ASM_API_VERSION, 0, | ||
"m", "()V", null, null); | ||
m.visitVarInsn(Opcodes.ALOAD, 0); | ||
m.visitMethodInsn(Opcodes.INVOKESTATIC, "Target$DefaultImpls", "m", | ||
"(LTarget;)V", false); | ||
m.visitInsn(Opcodes.RETURN); | ||
|
||
filter.filter(m, context, output); | ||
|
||
assertIgnored(); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
46 changes: 46 additions & 0 deletions
46
org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinDefaultMethodsFilter.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
/******************************************************************************* | ||
* Copyright (c) 2009, 2020 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.MethodInsnNode; | ||
import org.objectweb.asm.tree.MethodNode; | ||
|
||
/** | ||
* Filters methods that Kotlin compiler generates for non-overridden | ||
* non-abstract methods of interfaces. | ||
*/ | ||
final class KotlinDefaultMethodsFilter implements IFilter { | ||
|
||
public void filter(final MethodNode methodNode, | ||
final IFilterContext context, final IFilterOutput output) { | ||
if (!KotlinGeneratedFilter.isKotlinClass(context)) { | ||
return; | ||
} | ||
new Matcher().match(methodNode, output); | ||
} | ||
|
||
private static class Matcher extends AbstractMatcher { | ||
private void match(final MethodNode methodNode, | ||
final IFilterOutput output) { | ||
firstIsALoad0(methodNode); | ||
nextIs(Opcodes.INVOKESTATIC); | ||
if (cursor != null && ((MethodInsnNode) cursor).owner | ||
.endsWith("$DefaultImpls")) { | ||
output.ignore(methodNode.instructions.getFirst(), | ||
methodNode.instructions.getLast()); | ||
} | ||
} | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters