diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/java/UnimplementedKotlinInterfaceMemberAnnotator.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/java/UnimplementedKotlinInterfaceMemberAnnotator.kt index fb8c78bb9ca..48d3751c38f 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/java/UnimplementedKotlinInterfaceMemberAnnotator.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/java/UnimplementedKotlinInterfaceMemberAnnotator.kt @@ -18,7 +18,10 @@ import com.intellij.psi.* import org.jetbrains.kotlin.asJava.KtLightClassMarker import org.jetbrains.kotlin.asJava.classes.KtLightClassForSourceDeclaration import org.jetbrains.kotlin.asJava.elements.KtLightMethod +import org.jetbrains.kotlin.config.JvmAnalysisFlags +import org.jetbrains.kotlin.config.JvmDefaultMode import org.jetbrains.kotlin.idea.KotlinLanguage +import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind import org.jetbrains.kotlin.resolve.annotations.JVM_STATIC_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.annotations.JVM_DEFAULT_FQ_NAME @@ -30,6 +33,11 @@ class UnimplementedKotlinInterfaceMemberAnnotator : Annotator { if (element.isInterface || element.hasModifierProperty(PsiModifier.ABSTRACT)) return + val jvmDefaultMode = element.languageVersionSettings.getFlag(JvmAnalysisFlags.jvmDefaultMode) + if (jvmDefaultMode == JvmDefaultMode.ALL_COMPATIBILITY || jvmDefaultMode == JvmDefaultMode.ALL_INCOMPATIBLE) { + return + } + if (getAnyMethodToImplement(element) != null) return // reported by java default annotator findUnimplementedMethod(element)?.let { diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAll.java b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAll.java new file mode 100644 index 00000000000..f111a93d1cc --- /dev/null +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAll.java @@ -0,0 +1,3 @@ +package test; + +class ExtendInterfaceWithDefaultMethodAndCompatibilityAll implements KotlinInterface {} \ No newline at end of file diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAll.kt b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAll.kt new file mode 100644 index 00000000000..6ac53a83e60 --- /dev/null +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAll.kt @@ -0,0 +1,5 @@ +package test + +interface KotlinInterface { + fun bar() {} +} diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAll.txt b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAll.txt new file mode 100644 index 00000000000..a7dcae19568 --- /dev/null +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAll.txt @@ -0,0 +1 @@ +// COMPILER_ARGUMENTS: -Xjvm-default=all \ No newline at end of file diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAllCompatibility.java b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAllCompatibility.java new file mode 100644 index 00000000000..f111a93d1cc --- /dev/null +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAllCompatibility.java @@ -0,0 +1,3 @@ +package test; + +class ExtendInterfaceWithDefaultMethodAndCompatibilityAll implements KotlinInterface {} \ No newline at end of file diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAllCompatibility.kt b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAllCompatibility.kt new file mode 100644 index 00000000000..6ac53a83e60 --- /dev/null +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAllCompatibility.kt @@ -0,0 +1,5 @@ +package test + +interface KotlinInterface { + fun bar() {} +} diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAllCompatibility.txt b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAllCompatibility.txt new file mode 100644 index 00000000000..897907f940b --- /dev/null +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAllCompatibility.txt @@ -0,0 +1 @@ +// COMPILER_ARGUMENTS: -Xjvm-default=all-compatibility \ No newline at end of file diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityDisabled.java b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityDisabled.java new file mode 100644 index 00000000000..c774397fb75 --- /dev/null +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityDisabled.java @@ -0,0 +1,3 @@ +package test; + +class ExtendInterfaceWithDefaultMethodAndCompatibilityAll implements KotlinInterface {} \ No newline at end of file diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityDisabled.kt b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityDisabled.kt new file mode 100644 index 00000000000..6ac53a83e60 --- /dev/null +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityDisabled.kt @@ -0,0 +1,5 @@ +package test + +interface KotlinInterface { + fun bar() {} +} diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityDisabled.txt b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityDisabled.txt new file mode 100644 index 00000000000..55b117cae0f --- /dev/null +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityDisabled.txt @@ -0,0 +1 @@ +// COMPILER_ARGUMENTS: -Xjvm-default=disable \ 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 c77d96f570e..ab613da7c5b 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinBinariesCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinBinariesCheckerTestGenerated.java @@ -79,6 +79,21 @@ public class JavaAgainstKotlinBinariesCheckerTestGenerated extends AbstractJavaA runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendClassWithJvmDefaultImplementation.kt"); } + @TestMetadata("ExtendInterfaceWithDefaultMethodAndCompatibilityAll.kt") + public void testExtendInterfaceWithDefaultMethodAndCompatibilityAll() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAll.kt"); + } + + @TestMetadata("ExtendInterfaceWithDefaultMethodAndCompatibilityAllCompatibility.kt") + public void testExtendInterfaceWithDefaultMethodAndCompatibilityAllCompatibility() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAllCompatibility.kt"); + } + + @TestMetadata("ExtendInterfaceWithDefaultMethodAndCompatibilityDisabled.kt") + public void testExtendInterfaceWithDefaultMethodAndCompatibilityDisabled() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityDisabled.kt"); + } + @TestMetadata("ExtendingMutableInterfaces.kt") public void testExtendingMutableInterfaces() throws Exception { runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendingMutableInterfaces.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java index a8a6753d8f4..2ef110dcfc1 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java @@ -81,6 +81,21 @@ public class JavaAgainstKotlinSourceCheckerTestGenerated extends AbstractJavaAga runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendClassWithJvmDefaultImplementation.kt"); } + @TestMetadata("ExtendInterfaceWithDefaultMethodAndCompatibilityAll.kt") + public void testExtendInterfaceWithDefaultMethodAndCompatibilityAll() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAll.kt"); + } + + @TestMetadata("ExtendInterfaceWithDefaultMethodAndCompatibilityAllCompatibility.kt") + public void testExtendInterfaceWithDefaultMethodAndCompatibilityAllCompatibility() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAllCompatibility.kt"); + } + + @TestMetadata("ExtendInterfaceWithDefaultMethodAndCompatibilityDisabled.kt") + public void testExtendInterfaceWithDefaultMethodAndCompatibilityDisabled() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityDisabled.kt"); + } + @TestMetadata("ExtendingMutableInterfaces.kt") public void testExtendingMutableInterfaces() throws Exception { runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendingMutableInterfaces.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerWithoutUltraLightTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerWithoutUltraLightTestGenerated.java index a3a816d5335..5fab5a0cd15 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerWithoutUltraLightTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerWithoutUltraLightTestGenerated.java @@ -81,6 +81,21 @@ public class JavaAgainstKotlinSourceCheckerWithoutUltraLightTestGenerated extend runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendClassWithJvmDefaultImplementation.kt"); } + @TestMetadata("ExtendInterfaceWithDefaultMethodAndCompatibilityAll.kt") + public void testExtendInterfaceWithDefaultMethodAndCompatibilityAll() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAll.kt"); + } + + @TestMetadata("ExtendInterfaceWithDefaultMethodAndCompatibilityAllCompatibility.kt") + public void testExtendInterfaceWithDefaultMethodAndCompatibilityAllCompatibility() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAllCompatibility.kt"); + } + + @TestMetadata("ExtendInterfaceWithDefaultMethodAndCompatibilityDisabled.kt") + public void testExtendInterfaceWithDefaultMethodAndCompatibilityDisabled() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityDisabled.kt"); + } + @TestMetadata("ExtendingMutableInterfaces.kt") public void testExtendingMutableInterfaces() throws Exception { runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendingMutableInterfaces.kt");