From 0f896783db71e0fc90159eea643919946a88c468 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Tue, 6 Jul 2021 12:09:28 +0000 Subject: [PATCH] [kotlin] fix inspection about unimplemented method from Kotlin The problem is that such properties are compiled into the containing class (non-companion) and become static. As a result, without check for static, we though that such methods should be implemented in subclasses ^KTIJ-19052 Fixed GitOrigin-RevId: 8811026da5a1b9f678ce5a4b8968073ab06a97ab --- .../java/UnimplementedKotlinInterfaceMemberAnnotator.kt | 6 ++++-- .../JavaAgainstKotlinBinariesCheckerTestGenerated.java | 5 +++++ .../JavaAgainstKotlinSourceCheckerTestGenerated.java | 5 +++++ ...tKotlinSourceCheckerWithoutUltraLightTestGenerated.java | 5 +++++ .../ExtendInterfaceWithAJvmStaticMethodInCompanion.java | 1 + .../ExtendInterfaceWithAJvmStaticMethodInCompanion.kt | 7 +++++++ .../ExtendInterfaceWithAJvmStaticMethodInCompanion.txt | 1 + 7 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 plugins/kotlin/idea/tests/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithAJvmStaticMethodInCompanion.java create mode 100644 plugins/kotlin/idea/tests/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithAJvmStaticMethodInCompanion.kt create mode 100644 plugins/kotlin/idea/tests/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithAJvmStaticMethodInCompanion.txt diff --git a/plugins/kotlin/analysis/src/org/jetbrains/kotlin/idea/java/UnimplementedKotlinInterfaceMemberAnnotator.kt b/plugins/kotlin/analysis/src/org/jetbrains/kotlin/idea/java/UnimplementedKotlinInterfaceMemberAnnotator.kt index 29e53cd26e6e..85c06ffc8672 100644 --- a/plugins/kotlin/analysis/src/org/jetbrains/kotlin/idea/java/UnimplementedKotlinInterfaceMemberAnnotator.kt +++ b/plugins/kotlin/analysis/src/org/jetbrains/kotlin/idea/java/UnimplementedKotlinInterfaceMemberAnnotator.kt @@ -41,12 +41,14 @@ class UnimplementedKotlinInterfaceMemberAnnotator : Annotator { findUnimplementedMethod(element)?.let { report(it, holder, element) } - } private fun findUnimplementedMethod(psiClass: PsiClass): KtLightMethod? { val signaturesFromKotlinInterfaces = psiClass.visibleSignatures.filter { signature -> - signature.method.let { it is KtLightMethod && it.hasModifierProperty(PsiModifier.DEFAULT) } + val method = signature.method + method is KtLightMethod && + method.hasModifierProperty(PsiModifier.DEFAULT) && + !method.hasModifierProperty(PsiModifier.STATIC) }.ifEmpty { return null } val kotlinSuperClass = generateSequence(psiClass) { it.superClass }.firstOrNull { it is KtLightClassForSourceDeclaration } diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/checkers/JavaAgainstKotlinBinariesCheckerTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/checkers/JavaAgainstKotlinBinariesCheckerTestGenerated.java index 782c0d0f3d02..dc0b556d2b59 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/checkers/JavaAgainstKotlinBinariesCheckerTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/checkers/JavaAgainstKotlinBinariesCheckerTestGenerated.java @@ -73,6 +73,11 @@ public class JavaAgainstKotlinBinariesCheckerTestGenerated extends AbstractJavaA runTest("testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendClassWithJvmDefaultImplementation.kt"); } + @TestMetadata("ExtendInterfaceWithAJvmStaticMethodInCompanion.kt") + public void testExtendInterfaceWithAJvmStaticMethodInCompanion() throws Exception { + runTest("testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithAJvmStaticMethodInCompanion.kt"); + } + @TestMetadata("ExtendInterfaceWithDefaultMethodAndCompatibilityAll.kt") public void testExtendInterfaceWithDefaultMethodAndCompatibilityAll() throws Exception { runTest("testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAll.kt"); diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java index 88b865b1f5fc..935b93215039 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java @@ -75,6 +75,11 @@ public abstract class JavaAgainstKotlinSourceCheckerTestGenerated extends Abstra runTest("testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendClassWithJvmDefaultImplementation.kt"); } + @TestMetadata("ExtendInterfaceWithAJvmStaticMethodInCompanion.kt") + public void testExtendInterfaceWithAJvmStaticMethodInCompanion() throws Exception { + runTest("testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithAJvmStaticMethodInCompanion.kt"); + } + @TestMetadata("ExtendInterfaceWithDefaultMethodAndCompatibilityAll.kt") public void testExtendInterfaceWithDefaultMethodAndCompatibilityAll() throws Exception { runTest("testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAll.kt"); diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerWithoutUltraLightTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerWithoutUltraLightTestGenerated.java index 702990d606cc..927874c91414 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerWithoutUltraLightTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerWithoutUltraLightTestGenerated.java @@ -75,6 +75,11 @@ public abstract class JavaAgainstKotlinSourceCheckerWithoutUltraLightTestGenerat runTest("testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendClassWithJvmDefaultImplementation.kt"); } + @TestMetadata("ExtendInterfaceWithAJvmStaticMethodInCompanion.kt") + public void testExtendInterfaceWithAJvmStaticMethodInCompanion() throws Exception { + runTest("testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithAJvmStaticMethodInCompanion.kt"); + } + @TestMetadata("ExtendInterfaceWithDefaultMethodAndCompatibilityAll.kt") public void testExtendInterfaceWithDefaultMethodAndCompatibilityAll() throws Exception { runTest("testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithDefaultMethodAndCompatibilityAll.kt"); diff --git a/plugins/kotlin/idea/tests/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithAJvmStaticMethodInCompanion.java b/plugins/kotlin/idea/tests/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithAJvmStaticMethodInCompanion.java new file mode 100644 index 000000000000..1f76f185593e --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithAJvmStaticMethodInCompanion.java @@ -0,0 +1 @@ +public class ExtendInterfaceWithAJvmStaticMethodInCompanion implements KotlinWithCompanion {} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithAJvmStaticMethodInCompanion.kt b/plugins/kotlin/idea/tests/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithAJvmStaticMethodInCompanion.kt new file mode 100644 index 000000000000..17ee230bd6ac --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithAJvmStaticMethodInCompanion.kt @@ -0,0 +1,7 @@ +interface KotlinWithCompanion { + companion object { + @JvmStatic + val providers: String + get() = "" + } +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithAJvmStaticMethodInCompanion.txt b/plugins/kotlin/idea/tests/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithAJvmStaticMethodInCompanion.txt new file mode 100644 index 000000000000..fc3b677841d4 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/kotlinAndJavaChecker/javaAgainstKotlin/ExtendInterfaceWithAJvmStaticMethodInCompanion.txt @@ -0,0 +1 @@ +// WITH_RUNTIME \ No newline at end of file