From c8e84f82eb33d98fa7d0e4717b1459bcd94dfe95 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Thu, 15 Oct 2020 10:36:52 +0200 Subject: [PATCH] Proper check NON_JVM_DEFAULT_OVERRIDES_JAVA_DEFAULT in new jvm-default modes #KT-42699 Fixed --- ...endDiagnosticsTestWithStdlibGenerated.java | 5 ++ .../resolve/jvm/checkers/JvmDefaultChecker.kt | 2 +- .../diagnostics/DefaultErrorMessagesJvm.java | 2 +- .../annotations/jvmDefault/javaOverrideAll.kt | 70 ++++++++++++++++++ .../jvmDefault/javaOverrideAll.txt | 74 +++++++++++++++++++ .../DiagnosticsTestWithStdLibGenerated.java | 5 ++ ...ticsTestWithStdLibUsingJavacGenerated.java | 5 ++ .../LightAnalysisModeTestGenerated.java | 10 +-- 8 files changed, 166 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/javaOverrideAll.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/javaOverrideAll.txt diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestWithStdlibGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestWithStdlibGenerated.java index e84a64739bf..786e26784cf 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestWithStdlibGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestWithStdlibGenerated.java @@ -493,6 +493,11 @@ public class FirOldFrontendDiagnosticsTestWithStdlibGenerated extends AbstractFi runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/javaOverride.kt"); } + @TestMetadata("javaOverrideAll.kt") + public void testJavaOverrideAll() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/javaOverrideAll.kt"); + } + @TestMetadata("jvmDefaultInInheritance.kt") public void testJvmDefaultInInheritance() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/jvmDefaultInInheritance.kt"); diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmDefaultChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmDefaultChecker.kt index 474864bfd49..97fcbcd3a00 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmDefaultChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmDefaultChecker.kt @@ -68,7 +68,7 @@ class JvmDefaultChecker(val jvmTarget: JvmTarget, project: Project) : Declaratio } - if (isInterface(descriptor.containingDeclaration)) { + if (!jvmDefaultMode.forAllMethodsWithBody && isInterface(descriptor.containingDeclaration)) { val memberDescriptor = descriptor as? CallableMemberDescriptor ?: return if (descriptor is PropertyAccessorDescriptor) return diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java index 59fe13c484f..0b82f714d2c 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java @@ -144,7 +144,7 @@ public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension { MAP.put(JVM_DEFAULT_IN_DECLARATION, "Usage of ''@{0}'' is only allowed with -Xjvm-default option", STRING); MAP.put(JVM_DEFAULT_THROUGH_INHERITANCE, "Inheritance from an interface with '@JvmDefault' members is only allowed with -Xjvm-default option"); MAP.put(USAGE_OF_JVM_DEFAULT_THROUGH_SUPER_CALL, "Super calls of '@JvmDefault' members are only allowed with -Xjvm-default option"); - MAP.put(NON_JVM_DEFAULT_OVERRIDES_JAVA_DEFAULT, "Non-@JvmDefault interface method cannot override default Java method. Please annotate this method with @JvmDefault"); + MAP.put(NON_JVM_DEFAULT_OVERRIDES_JAVA_DEFAULT, "Non-@JvmDefault interface method cannot override default Java method. Please annotate this method with @JvmDefault or enable `-Xjvm-default=all|all-compatibility`"); MAP.put(EXPLICIT_METADATA_IS_DISALLOWED, "Explicit @Metadata is disallowed"); MAP.put(SUSPENSION_POINT_INSIDE_MONITOR, "A suspension point at {0} is inside a critical section", STRING); MAP.put(SUSPENSION_POINT_INSIDE_CRITICAL_SECTION, "The ''{0}'' suspension point is inside a critical section", NAME); diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/javaOverrideAll.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/javaOverrideAll.kt new file mode 100644 index 00000000000..66a25dff24c --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/javaOverrideAll.kt @@ -0,0 +1,70 @@ +// FIR_IDENTICAL +// !JVM_DEFAULT_MODE: all +// !JVM_TARGET: 1.8 + +// FILE: JavaInterface.java +public interface JavaInterface { + default void test() {} + + default void testForNonDefault() {} + + void testAbstract(); +} + +// FILE: 1.kt + +interface KotlinInterface : JavaInterface { + @JvmDefault + override fun test() {} + + override fun testForNonDefault() {} + + override fun testAbstract() {} +} + +interface KotlinInterface2 : JavaInterface, KotlinInterface { + override fun test() {} + + override fun testForNonDefault() {} + + override fun testAbstract() {} +} + + +interface KotlinInterfaceForIndirect : JavaInterface { + +} + +interface KotlinInterfaceIndirectInheritance : KotlinInterfaceForIndirect { + + override fun test() {} + + override fun testForNonDefault() {} + + override fun testAbstract() {} +} + +open class KotlinClass : JavaInterface { + override fun test() {} + + override fun testForNonDefault() {} + + override fun testAbstract() {} +} + +interface KotlinInterfaceX { + + fun test() {} + + fun testForNonDefault() {} + + fun testAbstract() {} +} + +interface KotlinInterfaceManySuper: JavaInterface, KotlinInterfaceX { + override fun test() {} + + override fun testForNonDefault() {} + + override fun testAbstract() {} +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/javaOverrideAll.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/javaOverrideAll.txt new file mode 100644 index 00000000000..892a3f0ae99 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/javaOverrideAll.txt @@ -0,0 +1,74 @@ +package + +public interface JavaInterface { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open fun test(): kotlin.Unit + public abstract fun testAbstract(): kotlin.Unit + public open fun testForNonDefault(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public open class KotlinClass : JavaInterface { + public constructor KotlinClass() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ fun test(): kotlin.Unit + public open override /*1*/ fun testAbstract(): kotlin.Unit + public open override /*1*/ fun testForNonDefault(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface KotlinInterface : JavaInterface { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + @kotlin.jvm.JvmDefault public open override /*1*/ fun test(): kotlin.Unit + public open override /*1*/ fun testAbstract(): kotlin.Unit + public open override /*1*/ fun testForNonDefault(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface KotlinInterface2 : JavaInterface, KotlinInterface { + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ fun test(): kotlin.Unit + public open override /*2*/ fun testAbstract(): kotlin.Unit + public open override /*2*/ fun testForNonDefault(): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface KotlinInterfaceForIndirect : JavaInterface { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun test(): kotlin.Unit + public abstract override /*1*/ /*fake_override*/ fun testAbstract(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun testForNonDefault(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface KotlinInterfaceIndirectInheritance : KotlinInterfaceForIndirect { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ fun test(): kotlin.Unit + public open override /*1*/ fun testAbstract(): kotlin.Unit + public open override /*1*/ fun testForNonDefault(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface KotlinInterfaceManySuper : JavaInterface, KotlinInterfaceX { + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ fun test(): kotlin.Unit + public open override /*2*/ fun testAbstract(): kotlin.Unit + public open override /*2*/ fun testForNonDefault(): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface KotlinInterfaceX { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open fun test(): kotlin.Unit + public open fun testAbstract(): kotlin.Unit + public open fun testForNonDefault(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java index 04ba656c289..f6e18fd621c 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java @@ -493,6 +493,11 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/javaOverride.kt"); } + @TestMetadata("javaOverrideAll.kt") + public void testJavaOverrideAll() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/javaOverrideAll.kt"); + } + @TestMetadata("jvmDefaultInInheritance.kt") public void testJvmDefaultInInheritance() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/jvmDefaultInInheritance.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java index d01da12d875..47f18944933 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java @@ -493,6 +493,11 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/javaOverride.kt"); } + @TestMetadata("javaOverrideAll.kt") + public void testJavaOverrideAll() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/javaOverrideAll.kt"); + } + @TestMetadata("jvmDefaultInInheritance.kt") public void testJvmDefaultInInheritance() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmDefault/jvmDefaultInInheritance.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 4082539fb39..fab577af33f 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -14759,11 +14759,6 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/anySuperCall.kt"); } - @TestMetadata("fieldNameClash.kt") - public void ignoreFieldNameClash() throws Exception { - runTest("compiler/testData/codegen/box/inlineClasses/fieldNameClash.kt"); - } - @TestMetadata("inlineClassWithCustomEquals.kt") public void ignoreInlineClassWithCustomEquals() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/inlineClassWithCustomEquals.kt"); @@ -15067,6 +15062,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/extLambdaInInlineClassFun2.kt"); } + @TestMetadata("fieldNameClash.kt") + public void testFieldNameClash() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/fieldNameClash.kt"); + } + @TestMetadata("genericInlineClassSynthMembers.kt") public void testGenericInlineClassSynthMembers() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/genericInlineClassSynthMembers.kt");