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 new file mode 100644 index 00000000000..e971ce38408 --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/EnumDeclaringClassDeprecationChecker.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.resolve.jvm.checkers + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor +import org.jetbrains.kotlin.descriptors.PropertyDescriptor +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.StandardClassIds +import org.jetbrains.kotlin.resolve.calls.checkers.CallChecker +import org.jetbrains.kotlin.resolve.calls.checkers.CallCheckerContext +import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall +import org.jetbrains.kotlin.resolve.descriptorUtil.classId +import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm +import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver + +object EnumDeclaringClassDeprecationChecker : CallChecker { + override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) { + val resultingDescriptor = resolvedCall.resultingDescriptor + 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 + context.trace.report(ErrorsJvm.ENUM_DECLARING_CLASS_DEPRECATED.on(context.languageVersionSettings, reportOn)) + } +} \ No newline at end of file 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 1933996b5f7..0bb4313d47e 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 @@ -228,6 +228,7 @@ public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension { MAP.put(TYPEOF_NON_REIFIED_TYPE_PARAMETER_WITH_RECURSIVE_BOUND, "Non-reified type parameters with recursive bounds are not supported yet: {0}", STRING); MAP.put(JAVA_SAM_INTERFACE_CONSTRUCTOR_REFERENCE, "Java SAM interface constructor references are prohibited"); + MAP.put(ENUM_DECLARING_CLASS_DEPRECATED, "Enum.declaringClass is deprecated, use javaDeclaringClass instead"); } @NotNull 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 67029b7f10a..34dea8aa1ac 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 @@ -206,6 +206,8 @@ public interface ErrorsJvm { DiagnosticFactory1 TYPEOF_NON_REIFIED_TYPE_PARAMETER_WITH_RECURSIVE_BOUND = DiagnosticFactory1.create(ERROR); DiagnosticFactory0 JAVA_SAM_INTERFACE_CONSTRUCTOR_REFERENCE = DiagnosticFactory0.create(ERROR); + DiagnosticFactoryForDeprecation0 ENUM_DECLARING_CLASS_DEPRECATED = + DiagnosticFactoryForDeprecation0.create(LanguageFeature.ProhibitEnumDeclaringClass); @SuppressWarnings("UnusedDeclaration") Object _initializer = new Object() { diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt index 140edf81ee9..936846eb25f 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt @@ -60,6 +60,7 @@ object JvmPlatformConfigurator : PlatformConfiguratorBase( InconsistentOperatorFromJavaCallChecker, PolymorphicSignatureCallChecker, SamInterfaceConstructorReferenceCallChecker, + EnumDeclaringClassDeprecationChecker, ), additionalTypeCheckers = listOf( diff --git a/compiler/testData/diagnostics/tests/enum/declaringClass.fir.kt b/compiler/testData/diagnostics/tests/enum/declaringClass.fir.kt index 7e3a26ceb51..679a5071d82 100644 --- a/compiler/testData/diagnostics/tests/enum/declaringClass.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/declaringClass.fir.kt @@ -1,5 +1,6 @@ // FULL_JDK // WITH_STDLIB +// !LANGUAGE: -ProhibitEnumDeclaringClass import java.util.* diff --git a/compiler/testData/diagnostics/tests/enum/declaringClass.kt b/compiler/testData/diagnostics/tests/enum/declaringClass.kt index 19c864cff60..cbd1eac117d 100644 --- a/compiler/testData/diagnostics/tests/enum/declaringClass.kt +++ b/compiler/testData/diagnostics/tests/enum/declaringClass.kt @@ -1,9 +1,10 @@ // FULL_JDK // WITH_STDLIB +// !LANGUAGE: -ProhibitEnumDeclaringClass import java.util.* fun > foo(values: Array) { - EnumSet.noneOf(values.first().declaringClass) + EnumSet.noneOf(values.first().declaringClass) EnumSet.noneOf(values.first().getDeclaringClass()) } diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index 322b52e5348..34ca39bab7d 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -267,6 +267,7 @@ enum class LanguageFeature( ProhibitArrayLiteralsInCompanionOfAnnotation(KOTLIN_1_9, kind = BUG_FIX), // KT-39041 ProhibitCyclesInAnnotations(KOTLIN_1_9, kind = BUG_FIX), // KT-47932 ForbidExtensionFunctionTypeOnNonFunctionTypes(KOTLIN_1_9), // related to KT-43527 + ProhibitEnumDeclaringClass(KOTLIN_1_9, kind = BUG_FIX), // KT-49653 // Temporarily disabled, see KT-27084/KT-22379 SoundSmartcastFromLoopConditionForLoopAssignedVariables(sinceVersion = null, kind = BUG_FIX),