diff options
author | Evgeny Mandrikov <138671+Godin@users.noreply.github.com> | 2020-02-09 19:10:09 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-09 18:10:09 +0100 |
commit | 04fe2006c0786a96462ef7336d162e4a527759e0 (patch) | |
tree | 3782d5bcbf13820b2e45a929c8938d61d5879d04 /org.jacoco.core/src/org/jacoco | |
parent | 5b225e7f678c85909191bca14d8334f1e9986521 (diff) | |
download | jacoco-04fe2006c0786a96462ef7336d162e4a527759e0.tar.gz |
Add filter for Kotlin default methods (#1012)
Diffstat (limited to 'org.jacoco.core/src/org/jacoco')
-rw-r--r-- | org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/Filters.java | 2 | ||||
-rw-r--r-- | org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinDefaultMethodsFilter.java | 46 |
2 files changed, 47 insertions, 1 deletions
diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/Filters.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/Filters.java index bbe041f6..b25bcf5c 100644 --- a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/Filters.java +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/Filters.java @@ -46,7 +46,7 @@ public final class Filters implements IFilter { new KotlinUnsafeCastOperatorFilter(), new KotlinNotNullOperatorFilter(), new KotlinDefaultArgumentsFilter(), new KotlinInlineFilter(), - new KotlinCoroutineFilter()); + new KotlinCoroutineFilter(), new KotlinDefaultMethodsFilter()); } private Filters(final IFilter... filters) { diff --git a/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinDefaultMethodsFilter.java b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinDefaultMethodsFilter.java new file mode 100644 index 00000000..65d783a1 --- /dev/null +++ b/org.jacoco.core/src/org/jacoco/core/internal/analysis/filter/KotlinDefaultMethodsFilter.java @@ -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()); + } + } + } + +} |