From 769a2ca9b19dc1c8b1c80470151bbe66b2ac667d Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 9 Sep 2022 11:31:34 +0200 Subject: [PATCH] K1: report ENUM_DECLARING_CLASS_DEPRECATED on enum entry properly #KT-53807 Fixed --- .../EnumDeclaringClassDeprecationChecker.kt | 5 ++++- .../tests/enum/declaringClass.fir.kt | 6 +++++ .../diagnostics/tests/enum/declaringClass.kt | 6 +++++ .../diagnostics/tests/enum/declaringClass.txt | 22 +++++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/EnumDeclaringClassDeprecationChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/EnumDeclaringClassDeprecationChecker.kt index e971ce38408..4aa97484584 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/EnumDeclaringClassDeprecationChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/EnumDeclaringClassDeprecationChecker.kt @@ -23,7 +23,10 @@ object EnumDeclaringClassDeprecationChecker : CallChecker { if (resultingDescriptor !is PropertyDescriptor || resultingDescriptor.kind != CallableMemberDescriptor.Kind.SYNTHESIZED) return val extensionReceiver = resultingDescriptor.extensionReceiverParameter?.value as? ExtensionReceiver ?: return if (resultingDescriptor.name.asString() != "declaringClass") return - if (extensionReceiver.type.constructor.declarationDescriptor.classId != StandardClassIds.Enum) return + val extensionReceiverConstructor = extensionReceiver.type.constructor + if (extensionReceiverConstructor.declarationDescriptor.classId != StandardClassIds.Enum && + extensionReceiverConstructor.supertypes.none { it.constructor.declarationDescriptor.classId == StandardClassIds.Enum } + ) return context.trace.report(ErrorsJvm.ENUM_DECLARING_CLASS_DEPRECATED.on(context.languageVersionSettings, reportOn)) } } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/enum/declaringClass.fir.kt b/compiler/testData/diagnostics/tests/enum/declaringClass.fir.kt index 679a5071d82..8b3dd76c8a0 100644 --- a/compiler/testData/diagnostics/tests/enum/declaringClass.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/declaringClass.fir.kt @@ -4,6 +4,12 @@ import java.util.* +enum class SomeEnum { A } + +fun bar() { + SomeEnum.A.declaringClass +} + fun > foo(values: Array) { EnumSet.noneOf(values.first().declaringClass) EnumSet.noneOf(values.first().getDeclaringClass()) diff --git a/compiler/testData/diagnostics/tests/enum/declaringClass.kt b/compiler/testData/diagnostics/tests/enum/declaringClass.kt index cbd1eac117d..ac06c1bd25c 100644 --- a/compiler/testData/diagnostics/tests/enum/declaringClass.kt +++ b/compiler/testData/diagnostics/tests/enum/declaringClass.kt @@ -4,6 +4,12 @@ import java.util.* +enum class SomeEnum { A } + +fun bar() { + SomeEnum.A.declaringClass +} + fun > foo(values: Array) { EnumSet.noneOf(values.first().declaringClass) EnumSet.noneOf(values.first().getDeclaringClass()) diff --git a/compiler/testData/diagnostics/tests/enum/declaringClass.txt b/compiler/testData/diagnostics/tests/enum/declaringClass.txt index 937cfc46a38..29ddea60dbb 100644 --- a/compiler/testData/diagnostics/tests/enum/declaringClass.txt +++ b/compiler/testData/diagnostics/tests/enum/declaringClass.txt @@ -1,3 +1,25 @@ package +public fun bar(): kotlin.Unit public fun > foo(/*0*/ values: kotlin.Array): kotlin.Unit + +public final enum class SomeEnum : kotlin.Enum { + enum entry A + + private constructor SomeEnum() + @kotlin.internal.IntrinsicConstEvaluation public final override /*1*/ /*fake_override*/ val name: kotlin.String + public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int + protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: SomeEnum): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit + public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class! + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + public final /*synthesized*/ val entries: kotlin.enums.EnumEntries + public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): SomeEnum + public final /*synthesized*/ fun values(): kotlin.Array +} +