diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt
index cf7af579cfd..d3c9bc46662 100644
--- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt
+++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt
@@ -104,7 +104,18 @@ public val PsiElement.namedUnwrappedElement: PsiNamedElement?
val KtClassOrObject.hasInterfaceDefaultImpls: Boolean
- get() = this is KtClass && isInterface()
+ get() = this is KtClass && isInterface() && hasNonAbstractMembers(this)
+
+private fun hasNonAbstractMembers(ktInterface: KtClass): Boolean {
+ return ktInterface.declarations.any {
+ isNonAbstractMember(it)
+ }
+}
+
+private fun isNonAbstractMember(member: KtDeclaration?): Boolean {
+ return (member is KtNamedFunction && member.hasBody()) ||
+ (member is KtProperty && (member.hasDelegateExpressionOrInitializer() || member.getter?.hasBody() ?: false || member.setter?.hasBody() ?: false))
+}
private val DEFAULT_IMPLS_CLASS_NAME = Name.identifier(JvmAbi.DEFAULT_IMPLS_CLASS_NAME)
fun FqName.defaultImplsChild() = child(DEFAULT_IMPLS_CLASS_NAME)
diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceDefaultImpls.java b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceDefaultImpls.java
new file mode 100644
index 00000000000..12fd906cb33
--- /dev/null
+++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceDefaultImpls.java
@@ -0,0 +1,13 @@
+import lib.*;
+
+class C {
+ public static void test(NonAbstractFun i, NonAbstractFunWithExpressionBody i2, NonAbstractProperty i3, NonAbstractPropertyWithBody i4) {
+ AllAbstract.DefaultImpls;
+
+ NonAbstractFun.DefaultImpls.f(i);
+ NonAbstractFunWithExpressionBody.DefaultImpls.f(i2);
+
+ NonAbstractProperty.DefaultImpls.getC(i3);
+ NonAbstractPropertyWithBody.DefaultImpls.getC(i4);
+ }
+}
diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceDefaultImpls.kt b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceDefaultImpls.kt
new file mode 100644
index 00000000000..d585dd46e9e
--- /dev/null
+++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceDefaultImpls.kt
@@ -0,0 +1,30 @@
+package lib
+
+interface AllAbstract {
+ val c: Int
+ fun f(t: T): T
+
+ val g: Int
+
+ var g2: String
+}
+
+interface NonAbstractFun {
+ fun f() {
+
+ }
+}
+
+interface NonAbstractFunWithExpressionBody {
+ fun f() = 3
+}
+
+interface NonAbstractProperty {
+ val c: Int get() = 3
+}
+
+interface NonAbstractPropertyWithBody {
+ val c: Int get() {
+ return 3
+ }
+}
\ No newline at end of file
diff --git a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinBinariesCheckerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinBinariesCheckerTestGenerated.java
index 9addd2dab6f..b5386f4f619 100644
--- a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinBinariesCheckerTestGenerated.java
+++ b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinBinariesCheckerTestGenerated.java
@@ -77,6 +77,12 @@ public class JavaAgainstKotlinBinariesCheckerTestGenerated extends AbstractJavaA
doTest(fileName);
}
+ @TestMetadata("InterfaceDefaultImpls.kt")
+ public void testInterfaceDefaultImpls() throws Exception {
+ String fileName = KotlinTestUtils.navigationMetadata("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceDefaultImpls.kt");
+ doTest(fileName);
+ }
+
@TestMetadata("JvmOverloadsFunctions.kt")
public void testJvmOverloadsFunctions() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/JvmOverloadsFunctions.kt");
diff --git a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java
index 6181befdd12..579bb1c38d1 100644
--- a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java
+++ b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java
@@ -79,6 +79,12 @@ public class JavaAgainstKotlinSourceCheckerTestGenerated extends AbstractJavaAga
doTest(fileName);
}
+ @TestMetadata("InterfaceDefaultImpls.kt")
+ public void testInterfaceDefaultImpls() throws Exception {
+ String fileName = KotlinTestUtils.navigationMetadata("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceDefaultImpls.kt");
+ doTest(fileName);
+ }
+
@TestMetadata("JvmOverloadsFunctions.kt")
public void testJvmOverloadsFunctions() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/JvmOverloadsFunctions.kt");