[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
This commit is contained in:
Mikhail Zarechenskiy
2021-07-06 12:09:28 +00:00
committed by intellij-monorepo-bot
parent 43db6f1cf9
commit 0f896783db
7 changed files with 28 additions and 2 deletions
@@ -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 }
@@ -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");
@@ -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");
@@ -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");
@@ -0,0 +1 @@
public class ExtendInterfaceWithAJvmStaticMethodInCompanion implements KotlinWithCompanion {}
@@ -0,0 +1,7 @@
interface KotlinWithCompanion {
companion object {
@JvmStatic
val providers: String
get() = ""
}
}