From 311cfc3806a5852b521599e6c4b941ed3200c14a Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Tue, 23 Jul 2019 14:59:48 +0300 Subject: [PATCH] UnimplementedKotlinInterfaceMemberAnnotator: shouldn't report methods with @JvmStatic #KT-27208 Fixed --- .../UnimplementedKotlinInterfaceMemberAnnotator.kt | 4 +++- .../javaAgainstKotlin/Interface.java | 1 + .../javaAgainstKotlin/Interface.kt | 5 +++++ .../javaAgainstKotlin/InterfaceWithJvmStatic.java | 3 +++ .../javaAgainstKotlin/InterfaceWithJvmStatic.kt | 8 ++++++++ .../javaAgainstKotlin/InterfaceWithJvmStatic.txt | 3 +++ .../JavaAgainstKotlinBinariesCheckerTestGenerated.java | 10 ++++++++++ .../JavaAgainstKotlinSourceCheckerTestGenerated.java | 10 ++++++++++ ...linSourceCheckerWithoutUltraLightTestGenerated.java | 10 ++++++++++ 9 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/Interface.java create mode 100644 idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/Interface.kt create mode 100644 idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceWithJvmStatic.java create mode 100644 idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceWithJvmStatic.kt create mode 100644 idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceWithJvmStatic.txt 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 d5d1e9aee57..799a4faf404 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,6 +18,7 @@ import com.intellij.psi.* import org.jetbrains.kotlin.asJava.classes.KtLightClassForSourceDeclaration import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.idea.KotlinLanguage +import org.jetbrains.kotlin.resolve.annotations.JVM_STATIC_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.annotations.JVM_DEFAULT_FQ_NAME import org.jetbrains.kotlin.utils.ifEmpty @@ -46,7 +47,8 @@ class UnimplementedKotlinInterfaceMemberAnnotator : Annotator { return signaturesFromKotlinInterfaces.firstOrNull { it !in signaturesVisibleThroughKotlinSuperClass && it.method.modifierList.annotations.none { annotation -> - annotation.qualifiedName == JVM_DEFAULT_FQ_NAME.asString() + val qualifiedName = annotation.qualifiedName + qualifiedName == JVM_DEFAULT_FQ_NAME.asString() || qualifiedName == JVM_STATIC_ANNOTATION_FQ_NAME.asString() } }?.method as? KtLightMethod } diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/Interface.java b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/Interface.java new file mode 100644 index 00000000000..be8f29370bb --- /dev/null +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/Interface.java @@ -0,0 +1 @@ +class Test implements A { } \ No newline at end of file diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/Interface.kt b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/Interface.kt new file mode 100644 index 00000000000..1a0c8c27392 --- /dev/null +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/Interface.kt @@ -0,0 +1,5 @@ +interface A { + companion object { + fun create() {} + } +} \ No newline at end of file diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceWithJvmStatic.java b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceWithJvmStatic.java new file mode 100644 index 00000000000..8bd423b40ea --- /dev/null +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceWithJvmStatic.java @@ -0,0 +1,3 @@ +package test; + +public class InterfaceWithJvmStatic implements A { } \ No newline at end of file diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceWithJvmStatic.kt b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceWithJvmStatic.kt new file mode 100644 index 00000000000..85a38a21a5c --- /dev/null +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceWithJvmStatic.kt @@ -0,0 +1,8 @@ +package test + +interface A { + companion object { + @JvmStatic + fun create() {} + } +} \ No newline at end of file diff --git a/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceWithJvmStatic.txt b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceWithJvmStatic.txt new file mode 100644 index 00000000000..a1b4acfa9e3 --- /dev/null +++ b/idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceWithJvmStatic.txt @@ -0,0 +1,3 @@ +// LANGUAGE_LEVEL 1.8 +// WITH_RUNTIME +// KOTLINC_EXTRA_OPTS -jvm-target, 1.8 \ 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 9c973e00fa6..6615cca7542 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinBinariesCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinBinariesCheckerTestGenerated.java @@ -109,11 +109,21 @@ public class JavaAgainstKotlinBinariesCheckerTestGenerated extends AbstractJavaA runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InferenceReturnType_1_8.kt"); } + @TestMetadata("Interface.kt") + public void testInterface() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/Interface.kt"); + } + @TestMetadata("InterfaceDefaultImpls.kt") public void testInterfaceDefaultImpls() throws Exception { runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceDefaultImpls.kt"); } + @TestMetadata("InterfaceWithJvmStatic.kt") + public void testInterfaceWithJvmStatic() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceWithJvmStatic.kt"); + } + @TestMetadata("JvmOverloadsFunctions.kt") public void testJvmOverloadsFunctions() throws Exception { runTest("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 13e7d7d9e4b..9b3145c4f4d 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerTestGenerated.java @@ -111,11 +111,21 @@ public class JavaAgainstKotlinSourceCheckerTestGenerated extends AbstractJavaAga runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InferenceReturnType_1_8.kt"); } + @TestMetadata("Interface.kt") + public void testInterface() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/Interface.kt"); + } + @TestMetadata("InterfaceDefaultImpls.kt") public void testInterfaceDefaultImpls() throws Exception { runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceDefaultImpls.kt"); } + @TestMetadata("InterfaceWithJvmStatic.kt") + public void testInterfaceWithJvmStatic() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceWithJvmStatic.kt"); + } + @TestMetadata("JvmOverloadsFunctions.kt") public void testJvmOverloadsFunctions() throws Exception { runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/JvmOverloadsFunctions.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerWithoutUltraLightTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerWithoutUltraLightTestGenerated.java index 1ecc6dcb6d3..7cbb1e168c2 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerWithoutUltraLightTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/JavaAgainstKotlinSourceCheckerWithoutUltraLightTestGenerated.java @@ -111,11 +111,21 @@ public class JavaAgainstKotlinSourceCheckerWithoutUltraLightTestGenerated extend runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InferenceReturnType_1_8.kt"); } + @TestMetadata("Interface.kt") + public void testInterface() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/Interface.kt"); + } + @TestMetadata("InterfaceDefaultImpls.kt") public void testInterfaceDefaultImpls() throws Exception { runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceDefaultImpls.kt"); } + @TestMetadata("InterfaceWithJvmStatic.kt") + public void testInterfaceWithJvmStatic() throws Exception { + runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/InterfaceWithJvmStatic.kt"); + } + @TestMetadata("JvmOverloadsFunctions.kt") public void testJvmOverloadsFunctions() throws Exception { runTest("idea/testData/kotlinAndJavaChecker/javaAgainstKotlin/JvmOverloadsFunctions.kt");