From f90cbb0ce7f1e786084e51b456c8a8f4373a0c46 Mon Sep 17 00:00:00 2001 From: Him188 Date: Wed, 31 Mar 2021 19:37:49 +0800 Subject: [PATCH] Support properties from primary constructor in JvmFieldApplicabilityChecker #KT-32753 In progress --- ...irOldFrontendDiagnosticsTestGenerated.java | 12 +- .../checkers/JvmFieldApplicabilityChecker.kt | 17 +- .../diagnostics/DefaultErrorMessagesJvm.java | 1 + .../resolve/jvm/diagnostics/ErrorsJvm.java | 1 + ...ir.kt => jvmFieldApplicability_1_5.fir.kt} | 7 +- .../jvmField/jvmFieldApplicability_1_5.kt | 148 +++++++++++++++++ ...lity.txt => jvmFieldApplicability_1_5.txt} | 9 ++ .../jvmField/jvmFieldApplicability_1_6.fir.kt | 148 +++++++++++++++++ ...bility.kt => jvmFieldApplicability_1_6.kt} | 7 +- .../jvmField/jvmFieldApplicability_1_6.txt | 151 ++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 12 +- .../kotlin/config/LanguageVersionSettings.kt | 1 + 12 files changed, 502 insertions(+), 12 deletions(-) rename compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/{jvmFieldApplicability.fir.kt => jvmFieldApplicability_1_5.fir.kt} (93%) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_5.kt rename compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/{jvmFieldApplicability.txt => jvmFieldApplicability_1_5.txt} (94%) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_6.fir.kt rename compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/{jvmFieldApplicability.kt => jvmFieldApplicability_1_6.kt} (94%) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_6.txt diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index d4f76c47a07..cc613311df9 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -31457,9 +31457,15 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti } @Test - @TestMetadata("jvmFieldApplicability.kt") - public void testJvmFieldApplicability() throws Exception { - runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability.kt"); + @TestMetadata("jvmFieldApplicability_1_5.kt") + public void testJvmFieldApplicability_1_5() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_5.kt"); + } + + @Test + @TestMetadata("jvmFieldApplicability_1_6.kt") + public void testJvmFieldApplicability_1_6() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_6.kt"); } } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmFieldApplicabilityChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmFieldApplicabilityChecker.kt index f537a3eb1ba..60f59e1650e 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmFieldApplicabilityChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmFieldApplicabilityChecker.kt @@ -23,7 +23,9 @@ import org.jetbrains.kotlin.fileClasses.isInsideJvmMultifileClassFile import org.jetbrains.kotlin.load.java.DescriptorsJvmAbiUtil import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.KtProperty +import org.jetbrains.kotlin.psi.KtValueArgument import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorUtils @@ -53,18 +55,18 @@ class JvmFieldApplicabilityChecker : DeclarationChecker { } override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) { - if (descriptor !is PropertyDescriptor || declaration !is KtProperty) return + if (descriptor !is PropertyDescriptor || (declaration !is KtProperty && declaration !is KtParameter)) return val annotation = descriptor.findJvmFieldAnnotation() ?: descriptor.delegateField?.annotations?.findAnnotation(JvmAbi.JVM_FIELD_ANNOTATION_FQ_NAME) ?: return val problem = when { - declaration.hasDelegate() -> DELEGATE + declaration is KtProperty && declaration.hasDelegate() -> DELEGATE !descriptor.hasBackingField(context.trace.bindingContext) -> return descriptor.isOverridable -> NOT_FINAL DescriptorVisibilities.isPrivate(descriptor.visibility) -> PRIVATE - declaration.hasCustomAccessor() -> CUSTOM_ACCESSOR + declaration is KtProperty && declaration.hasCustomAccessor() -> CUSTOM_ACCESSOR descriptor.overriddenDescriptors.isNotEmpty() -> OVERRIDES descriptor.isLateInit -> LATEINIT descriptor.isConst -> CONST @@ -83,7 +85,14 @@ class JvmFieldApplicabilityChecker : DeclarationChecker { } val annotationEntry = DescriptorToSourceUtils.getSourceFromAnnotation(annotation) ?: return - context.trace.report(ErrorsJvm.INAPPLICABLE_JVM_FIELD.on(annotationEntry, problem.errorMessage)) + + val factory = + if (declaration is KtParameter && !context.languageVersionSettings.supportsFeature(LanguageFeature.ProhibitJvmFieldOnOverrideFromInterfaceInPrimaryConstructor)) { + ErrorsJvm.INAPPLICABLE_JVM_FIELD_WARNING + } else { + ErrorsJvm.INAPPLICABLE_JVM_FIELD + } + context.trace.report(factory.on(annotationEntry, problem.errorMessage)) } private fun isInterfaceCompanionWithPublicJvmFieldProperties(companionObject: ClassDescriptor): Boolean { 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 6674f79772b..72d843f146f 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 @@ -120,6 +120,7 @@ public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension { MAP.put(UPPER_BOUND_CANNOT_BE_ARRAY, "Upper bound of a type parameter cannot be an array"); MAP.put(INAPPLICABLE_JVM_FIELD, "{0}", STRING); + MAP.put(INAPPLICABLE_JVM_FIELD_WARNING, "{0}. This warning will become an error in further releases", STRING); MAP.put(JVM_SYNTHETIC_ON_DELEGATE, "'@JvmSynthetic' annotation cannot be used on delegated properties"); diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java index 383503c7924..35b0c2e38e9 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java @@ -38,6 +38,7 @@ public interface ErrorsJvm { DiagnosticFactory0 ILLEGAL_JVM_NAME = DiagnosticFactory0.create(ERROR); DiagnosticFactory1 INAPPLICABLE_JVM_FIELD = DiagnosticFactory1.create(ERROR); + DiagnosticFactory1 INAPPLICABLE_JVM_FIELD_WARNING = DiagnosticFactory1.create(WARNING); DiagnosticFactory0 JVM_SYNTHETIC_ON_DELEGATE = DiagnosticFactory0.create(ERROR); diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_5.fir.kt similarity index 93% rename from compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability.fir.kt rename to compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_5.fir.kt index d7b92c8ea9e..4d348041a96 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_5.fir.kt @@ -1,4 +1,4 @@ -// !LANGUAGE: +NestedClassesInAnnotations +InlineClasses -JvmInlineValueClasses +// !LANGUAGE: +NestedClassesInAnnotations +InlineClasses -JvmInlineValueClasses -ProhibitJvmFieldOnOverrideFromInterfaceInPrimaryConstructor // !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE @kotlin.jvm.JvmField @@ -114,6 +114,11 @@ open class KKK : K { override final val j: Int = 0 } +class JK( + override val i: Int, + @JvmField override val j: Int, +) : K + annotation class L { companion object { @JvmField diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_5.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_5.kt new file mode 100644 index 00000000000..c160970ccc7 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_5.kt @@ -0,0 +1,148 @@ +// !LANGUAGE: +NestedClassesInAnnotations +InlineClasses -JvmInlineValueClasses -ProhibitJvmFieldOnOverrideFromInterfaceInPrimaryConstructor +// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE + +@kotlin.jvm.JvmField +fun foo() { + @kotlin.jvm.JvmField val x = "A" +} + +annotation class DemoAnnotation + +@JvmField +abstract class C : I{ + + @kotlin.jvm.JvmField constructor(s: String) { + } + + @kotlin.jvm.JvmField private fun foo(s: String = "OK") { + } + + @JvmField val a: String by lazy { "A" } + + @JvmField open val b: Int = 3 + + @JvmField abstract val c: Int + + @JvmField + val customGetter: String = "" + get() = field + + @JvmField + val explicitDefaultGetter: String = "" + get + + @JvmField + var explicitDefaultSetter: String = "" + set + + @JvmField + val explicitDefaultAnnotatedGetter: String = "" + @DemoAnnotation get + + @JvmField + var explicitDefaultAnnotatedSetter: String = "" + @DemoAnnotation set + + @JvmField + var customSetter: String = "" + set(s) { + field = s + } + + @JvmField + val noBackingField: String + get() = "a" + + @JvmField + final override val ai = 3 + + @JvmField + private val private = 3 +} + +interface I { + @JvmField val ai: Int + @JvmField val bi: Int + get() = 5 +} + +class G { + @JvmField + lateinit var lateInit: String + + @delegate:JvmField + val s: String by lazy { "s" } +} + +@JvmField +const val Const = 4 + +@JvmField +var i = 5 + +class H { + companion object { + @JvmField + var c = 3 + } +} + +interface K { + + val i: Int + val j: Int + + companion object { + @JvmField + var c = 3 + + var x = 3 + } +} + +class KK : K { + @JvmField + override val i: Int = 0 + @JvmField + override final val j: Int = 0 +} + +open class KKK : K { + @JvmField + override val i: Int = 0 + @JvmField + override final val j: Int = 0 +} + +class JK( + override val i: Int, + @JvmField override val j: Int, +) : K + +annotation class L { + companion object { + @JvmField + var c = 3 + } +} + +object O { + @JvmField + val c = 3 +} + +@JvmField +private val private = 3 + +inline class Foo(val x: Int) + +object IObject { + @JvmField + val c: Foo = Foo(42) + + @JvmField + val u = 42u + + @JvmField + private val r: Result = TODO() +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_5.txt similarity index 94% rename from compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability.txt rename to compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_5.txt index 2926afabe09..9dc62dcd505 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_5.txt @@ -83,6 +83,15 @@ public object IObject { public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } +public final class JK : K { + public constructor JK(/*0*/ i: kotlin.Int, /*1*/ j: kotlin.Int) + public open override /*1*/ val i: kotlin.Int + @field:kotlin.jvm.JvmField public open override /*1*/ val j: kotlin.Int + 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 toString(): kotlin.String +} + public interface K { public abstract val i: kotlin.Int public abstract val j: kotlin.Int diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_6.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_6.fir.kt new file mode 100644 index 00000000000..60615c92017 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_6.fir.kt @@ -0,0 +1,148 @@ +// !LANGUAGE: +NestedClassesInAnnotations +InlineClasses -JvmInlineValueClasses +ProhibitJvmFieldOnOverrideFromInterfaceInPrimaryConstructor +// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE + +@kotlin.jvm.JvmField +fun foo() { + @kotlin.jvm.JvmField val x = "A" +} + +annotation class DemoAnnotation + +@JvmField +abstract class C : I{ + + @kotlin.jvm.JvmField constructor(s: String) { + } + + @kotlin.jvm.JvmField private fun foo(s: String = "OK") { + } + + @JvmField val a: String by lazy { "A" } + + @JvmField open val b: Int = 3 + + @JvmField abstract val c: Int + + @JvmField + val customGetter: String = "" + get() = field + + @JvmField + val explicitDefaultGetter: String = "" + get + + @JvmField + var explicitDefaultSetter: String = "" + set + + @JvmField + val explicitDefaultAnnotatedGetter: String = "" + @DemoAnnotation get + + @JvmField + var explicitDefaultAnnotatedSetter: String = "" + @DemoAnnotation set + + @JvmField + var customSetter: String = "" + set(s) { + field = s + } + + @JvmField + val noBackingField: String + get() = "a" + + @JvmField + final override val ai = 3 + + @JvmField + private val private = 3 +} + +interface I { + @JvmField val ai: Int + @JvmField val bi: Int + get() = 5 +} + +class G { + @JvmField + lateinit var lateInit: String + + @delegate:JvmField + val s: String by lazy { "s" } +} + +@JvmField +const val Const = 4 + +@JvmField +var i = 5 + +class H { + companion object { + @JvmField + var c = 3 + } +} + +interface K { + + val i: Int + val j: Int + + companion object { + @JvmField + var c = 3 + + var x = 3 + } +} + +class KK : K { + @JvmField + override val i: Int = 0 + @JvmField + override final val j: Int = 0 +} + +open class KKK : K { + @JvmField + override val i: Int = 0 + @JvmField + override final val j: Int = 0 +} + +class JK( + override val i: Int, + @JvmField override val j: Int, +) : K + +annotation class L { + companion object { + @JvmField + var c = 3 + } +} + +object O { + @JvmField + val c = 3 +} + +@JvmField +private val private = 3 + +inline class Foo(val x: Int) + +object IObject { + @JvmField + val c: Foo = Foo(42) + + @JvmField + val u = 42u + + @JvmField + private val r: Result = TODO() +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_6.kt similarity index 94% rename from compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability.kt rename to compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_6.kt index bbfa1038ab6..997c38c7039 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_6.kt @@ -1,4 +1,4 @@ -// !LANGUAGE: +NestedClassesInAnnotations +InlineClasses -JvmInlineValueClasses +// !LANGUAGE: +NestedClassesInAnnotations +InlineClasses -JvmInlineValueClasses +ProhibitJvmFieldOnOverrideFromInterfaceInPrimaryConstructor // !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE @kotlin.jvm.JvmField @@ -114,6 +114,11 @@ open class KKK : K { override final val j: Int = 0 } +class JK( + override val i: Int, + @JvmField override val j: Int, +) : K + annotation class L { companion object { @JvmField diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_6.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_6.txt new file mode 100644 index 00000000000..9dc62dcd505 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_6.txt @@ -0,0 +1,151 @@ +package + +@field:kotlin.jvm.JvmField public const val Const: kotlin.Int = 4 +@field:kotlin.jvm.JvmField public var i: kotlin.Int +@field:kotlin.jvm.JvmField private val private: kotlin.Int = 3 +@kotlin.jvm.JvmField public fun foo(): kotlin.Unit + +@kotlin.jvm.JvmField public abstract class C : I { + @kotlin.jvm.JvmField public constructor C(/*0*/ s: kotlin.String) + @field:kotlin.jvm.JvmField public final val a: kotlin.String + @field:kotlin.jvm.JvmField public final override /*1*/ val ai: kotlin.Int = 3 + @field:kotlin.jvm.JvmField public open val b: kotlin.Int = 3 + @field:kotlin.jvm.JvmField public open override /*1*/ /*fake_override*/ val bi: kotlin.Int + @field:kotlin.jvm.JvmField public abstract val c: kotlin.Int + @field:kotlin.jvm.JvmField public final val customGetter: kotlin.String = "" + @field:kotlin.jvm.JvmField public final var customSetter: kotlin.String + @field:kotlin.jvm.JvmField @get:DemoAnnotation public final val explicitDefaultAnnotatedGetter: kotlin.String = "" + @field:kotlin.jvm.JvmField @set:DemoAnnotation public final var explicitDefaultAnnotatedSetter: kotlin.String + @field:kotlin.jvm.JvmField public final val explicitDefaultGetter: kotlin.String = "" + @field:kotlin.jvm.JvmField public final var explicitDefaultSetter: kotlin.String + @field:kotlin.jvm.JvmField public final val noBackingField: kotlin.String + @field:kotlin.jvm.JvmField private final val private: kotlin.Int = 3 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + @kotlin.jvm.JvmField private final fun foo(/*0*/ s: kotlin.String = ...): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final annotation class DemoAnnotation : kotlin.Annotation { + public constructor DemoAnnotation() + 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 toString(): kotlin.String +} + +public final inline class Foo { + public constructor Foo(/*0*/ x: kotlin.Int) + public final val x: kotlin.Int + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String +} + +public final class G { + public constructor G() + @field:kotlin.jvm.JvmField public final lateinit var lateInit: kotlin.String + @delegate:kotlin.jvm.JvmField public final val s: kotlin.String + 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 toString(): kotlin.String +} + +public final class H { + public constructor H() + 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 toString(): kotlin.String + + public companion object Companion { + private constructor Companion() + @field:kotlin.jvm.JvmField public final var c: kotlin.Int + 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 toString(): kotlin.String + } +} + +public interface I { + @field:kotlin.jvm.JvmField public abstract val ai: kotlin.Int + @field:kotlin.jvm.JvmField public open val bi: kotlin.Int + 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 toString(): kotlin.String +} + +public object IObject { + private constructor IObject() + @field:kotlin.jvm.JvmField public final val c: Foo + @field:kotlin.jvm.JvmField private final val r: kotlin.Result + @field:kotlin.jvm.JvmField public final val u: kotlin.UInt = 42.toUInt() + 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 toString(): kotlin.String +} + +public final class JK : K { + public constructor JK(/*0*/ i: kotlin.Int, /*1*/ j: kotlin.Int) + public open override /*1*/ val i: kotlin.Int + @field:kotlin.jvm.JvmField public open override /*1*/ val j: kotlin.Int + 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 toString(): kotlin.String +} + +public interface K { + public abstract val i: kotlin.Int + public abstract val j: kotlin.Int + 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 toString(): kotlin.String + + public companion object Companion { + private constructor Companion() + @field:kotlin.jvm.JvmField public final var c: kotlin.Int + public final var x: kotlin.Int + 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 toString(): kotlin.String + } +} + +public final class KK : K { + public constructor KK() + @field:kotlin.jvm.JvmField public open override /*1*/ val i: kotlin.Int = 0 + @field:kotlin.jvm.JvmField public final override /*1*/ val j: kotlin.Int = 0 + 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 toString(): kotlin.String +} + +public open class KKK : K { + public constructor KKK() + @field:kotlin.jvm.JvmField public open override /*1*/ val i: kotlin.Int = 0 + @field:kotlin.jvm.JvmField public final override /*1*/ val j: kotlin.Int = 0 + 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 toString(): kotlin.String +} + +public final annotation class L : kotlin.Annotation { + public constructor L() + 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 toString(): kotlin.String + + public companion object Companion { + private constructor Companion() + @field:kotlin.jvm.JvmField public final var c: kotlin.Int + 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 toString(): kotlin.String + } +} + +public object O { + private constructor O() + @field:kotlin.jvm.JvmField public final val c: kotlin.Int = 3 + 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 toString(): kotlin.String +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 6c3b9ea5a79..9562245d726 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -31553,9 +31553,15 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { } @Test - @TestMetadata("jvmFieldApplicability.kt") - public void testJvmFieldApplicability() throws Exception { - runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability.kt"); + @TestMetadata("jvmFieldApplicability_1_5.kt") + public void testJvmFieldApplicability_1_5() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_5.kt"); + } + + @Test + @TestMetadata("jvmFieldApplicability_1_6.kt") + public void testJvmFieldApplicability_1_6() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/jvmFieldApplicability_1_6.kt"); } } diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index 9642f885f0b..b23281dbe06 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -163,6 +163,7 @@ enum class LanguageFeature( * (if @NotNull has TYPE_USE and METHOD target, then `@NotNull Integer []` -> `Array..Array?` instead of `Array..Array`) */ TypeEnhancementImprovementsInStrictMode(KOTLIN_1_6), + ProhibitJvmFieldOnOverrideFromInterfaceInPrimaryConstructor(KOTLIN_1_6, kind = BUG_FIX), // Temporarily disabled, see KT-27084/KT-22379 SoundSmartcastFromLoopConditionForLoopAssignedVariables(sinceVersion = null, kind = BUG_FIX),