diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt index 2a80ffba220..b789823282f 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt @@ -190,6 +190,7 @@ fun deserializeClassToSymbol( classId.relativeClassName ) generateValueOfFunction(moduleData, classId.packageFqName, classId.relativeClassName) + generateEntriesGetter(moduleData, classId.packageFqName, classId.relativeClassName) } addCloneForArrayIfNeeded(classId, context.dispatchReceiver) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index c5e6a85d44c..fdc82b34b5a 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -740,7 +740,8 @@ class Fir2IrDeclarationStorage( } bindAndDeclareParameters( propertyAccessor, irParent, - thisReceiverOwner, isStatic = irParent !is IrClass, parentPropertyReceiverType = property.receiverTypeRef + thisReceiverOwner, isStatic = irParent !is IrClass || propertyAccessor?.isStatic == true, + parentPropertyReceiverType = property.receiverTypeRef ) leaveScope(this) if (irParent != null) { @@ -853,7 +854,9 @@ class Fir2IrDeclarationStorage( containingClass: ConeClassLikeLookupTag? = (irParent as? IrClass)?.classId?.let { ConeClassLikeLookupTagImpl(it) }, forceTopLevelPrivate: Boolean = false, ): IrProperty = convertCatching(property) { - val origin = property.computeIrOrigin(predefinedOrigin) + val origin = if (property.isStatic && property.name in ENUM_SYNTHETIC_NAMES) + IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER + else property.computeIrOrigin(predefinedOrigin) // See similar comments in createIrFunction above val signature = runUnless( @@ -1606,7 +1609,8 @@ class Fir2IrDeclarationStorage( companion object { internal val ENUM_SYNTHETIC_NAMES = mapOf( Name.identifier("values") to IrSyntheticBodyKind.ENUM_VALUES, - Name.identifier("valueOf") to IrSyntheticBodyKind.ENUM_VALUEOF + Name.identifier("valueOf") to IrSyntheticBodyKind.ENUM_VALUEOF, + Name.identifier("entries") to IrSyntheticBodyKind.ENUM_ENTRIES ) } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt index 4e3b41e3d0f..6813cfdd88d 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/ClassMemberGenerator.kt @@ -168,6 +168,7 @@ internal class ClassMemberGenerator( } } else if (irFunction !is IrConstructor && !irFunction.isExpect) { when { + // Create fake bodies for Enum.values/Enum.valueOf irFunction.origin == IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER -> { val kind = Fir2IrDeclarationStorage.ENUM_SYNTHETIC_NAMES.getValue(irFunction.name) irFunction.body = IrSyntheticBodyImpl(startOffset, endOffset, kind) @@ -215,6 +216,12 @@ internal class ClassMemberGenerator( isGetter = true, containingClass = containingClass ) + // Create fake body for Enum.entries + if (irProperty.origin == IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER) { + val kind = Fir2IrDeclarationStorage.ENUM_SYNTHETIC_NAMES.getValue(irProperty.name) + irProperty.getter!!.body = IrSyntheticBodyImpl(irProperty.startOffset, irProperty.endOffset, kind) + } + if (property.isVar) { irProperty.setter?.setPropertyAccessorContent( property, property.setter, irProperty, propertyType, diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java index 18a257fd94e..0296f20cea3 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java @@ -136,6 +136,12 @@ public class Fir2IrTextTestGenerated extends AbstractFir2IrTextTest { runTest("compiler/testData/ir/irText/classes/enumClassModality.kt"); } + @Test + @TestMetadata("enumEntries.kt") + public void testEnumEntries() throws Exception { + runTest("compiler/testData/ir/irText/classes/enumEntries.kt"); + } + @Test @TestMetadata("enumWithMultipleCtors.kt") public void testEnumWithMultipleCtors() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java index 7b4b096147a..cfb85945a13 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java @@ -136,6 +136,12 @@ public class LightTreeFir2IrTextTestGenerated extends AbstractLightTreeFir2IrTex runTest("compiler/testData/ir/irText/classes/enumClassModality.kt"); } + @Test + @TestMetadata("enumEntries.kt") + public void testEnumEntries() throws Exception { + runTest("compiler/testData/ir/irText/classes/enumEntries.kt"); + } + @Test @TestMetadata("enumWithMultipleCtors.kt") public void testEnumWithMultipleCtors() throws Exception { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt index 7cc7dddfadd..2033ad7bb46 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt @@ -348,6 +348,7 @@ abstract class FirJavaFacade( classId.relativeClassName ) generateValueOfFunction(moduleData, classId.packageFqName, classId.relativeClassName) + generateEntriesGetter(moduleData, classId.packageFqName, classId.relativeClassName) } if (classIsAnnotation) { declarations += diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index d8d80a8e7f7..d5c2e6ed0ef 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -590,6 +590,12 @@ class DeclarationsConverter( context.className, modifiers.hasExpect() ) + generateEntriesGetter( + baseModuleData, + context.packageFqName, + context.className, + modifiers.hasExpect() + ) } initCompanionObjectSymbolAttr() diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 03531ce90f1..e23e12ca5c2 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -1167,6 +1167,10 @@ open class RawFirBuilder( baseModuleData, context.packageFqName, context.className, classIsExpect ) + generateEntriesGetter( + baseModuleData, context.packageFqName, context.className, + classIsExpect + ) } initCompanionObjectSymbolAttr() diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/EnumClassUtils.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/EnumClassUtils.kt index 7e128f1a9e8..dd84ae1a8d7 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/EnumClassUtils.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/EnumClassUtils.kt @@ -7,22 +7,24 @@ package org.jetbrains.kotlin.fir import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.builtins.StandardNames.DEFAULT_VALUE_PARAMETER +import org.jetbrains.kotlin.builtins.StandardNames.ENUM_ENTRIES import org.jetbrains.kotlin.builtins.StandardNames.ENUM_VALUES import org.jetbrains.kotlin.builtins.StandardNames.ENUM_VALUE_OF +import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fakeElement import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -import org.jetbrains.kotlin.fir.declarations.builder.FirRegularClassBuilder -import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction -import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter +import org.jetbrains.kotlin.fir.declarations.builder.* import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl +import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl import org.jetbrains.kotlin.fir.expressions.builder.buildEmptyExpressionBlock import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl @@ -114,6 +116,49 @@ fun FirRegularClassBuilder.generateValueOfFunction( } } +fun FirRegularClassBuilder.generateEntriesGetter( + moduleData: FirModuleData, packageFqName: FqName, classFqName: FqName, makeExpect: Boolean = false +) { + if (!moduleData.session.languageVersionSettings.supportsFeature(LanguageFeature.EnumEntries)) { + return + } + + val sourceElement = source?.fakeElement(KtFakeSourceElementKind.EnumGeneratedDeclaration) + declarations += buildProperty { + source = sourceElement + isVar = false + isLocal = false + origin = FirDeclarationOrigin.Source + this.moduleData = moduleData + returnTypeRef = buildResolvedTypeRef { + source = sourceElement + type = ConeClassLikeTypeImpl( + ConeClassLikeLookupTagImpl(StandardClassIds.EnumEntries), + arrayOf( + ConeClassLikeTypeImpl(this@generateEntriesGetter.symbol.toLookupTag(), emptyArray(), isNullable = false) + ), + isNullable = false + ) + } + name = ENUM_ENTRIES + this.status = createStatus(this@generateEntriesGetter.status).apply { + isStatic = true + isExpect = makeExpect + } + symbol = FirPropertySymbol(CallableId(packageFqName, classFqName, ENUM_ENTRIES)) + resolvePhase = FirResolvePhase.BODY_RESOLVE + getter = FirDefaultPropertyGetter( + sourceElement?.fakeElement(KtFakeSourceElementKind.EnumGeneratedDeclaration), + moduleData, FirDeclarationOrigin.Source, returnTypeRef.copyWithNewSourceKind(KtFakeSourceElementKind.EnumGeneratedDeclaration), + Visibilities.Public, symbol + ).apply { + (status as FirDeclarationStatusImpl).isStatic = true + } + }.apply { + containingClassForStaticMemberAttr = this@generateEntriesGetter.symbol.toLookupTag() + } +} + private fun createStatus(parentStatus: FirDeclarationStatus): FirDeclarationStatusImpl { val parentEffectiveVisibility = (parentStatus as? FirResolvedDeclarationStatusImpl)?.effectiveVisibility return if (parentEffectiveVisibility != null) { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/declarationAttributes.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/declarationAttributes.kt index 746604e0106..605cfd694d0 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/declarationAttributes.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/declarationAttributes.kt @@ -77,6 +77,7 @@ val FirProperty.hasBackingField: Boolean if (isAbstract) return false if (delegate != null) return false if (hasExplicitBackingField) return true + if (isStatic) return false // For Enum.entries when (origin) { FirDeclarationOrigin.SubstitutionOverride -> return false FirDeclarationOrigin.IntersectionOverride -> return false diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt index a8ea8b8a807..a82c662c1c7 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt @@ -490,6 +490,7 @@ class EnumSyntheticFunctionsLowering(val context: JsCommonBackendContext) : Decl statements += when (kind) { IrSyntheticBodyKind.ENUM_VALUES -> createEnumValuesBody(declaration, enumClass) IrSyntheticBodyKind.ENUM_VALUEOF -> createEnumValueOfBody(declaration, enumClass) + IrSyntheticBodyKind.ENUM_ENTRIES -> TODO("NOT IMPLEMENTED ON JS") }.statements } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrSyntheticBodyKind.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrSyntheticBodyKind.kt index ecc3c7aceff..6cd89f7133d 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrSyntheticBodyKind.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrSyntheticBodyKind.kt @@ -7,5 +7,6 @@ package org.jetbrains.kotlin.ir.expressions enum class IrSyntheticBodyKind { ENUM_VALUES, - ENUM_VALUEOF + ENUM_VALUEOF, + ENUM_ENTRIES } diff --git a/compiler/testData/ir/irText/classes/enumEntries.ir.txt b/compiler/testData/ir/irText/classes/enumEntries.ir.txt new file mode 100644 index 00000000000..d4d800e7f6b --- /dev/null +++ b/compiler/testData/ir/irText/classes/enumEntries.ir.txt @@ -0,0 +1,73 @@ +FILE fqName: fileName:/enumEntries.kt + CLASS ENUM_CLASS name:MyEnum modality:FINAL visibility:public superTypes:[kotlin.Enum<.MyEnum>] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.MyEnum + CONSTRUCTOR visibility:private <> () returnType:.MyEnum [primary] + BLOCK_BODY + ENUM_CONSTRUCTOR_CALL 'public constructor (name: kotlin.String, ordinal: kotlin.Int) [primary] declared in kotlin.Enum' + : .MyEnum + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS ENUM_CLASS name:MyEnum modality:FINAL visibility:public superTypes:[kotlin.Enum<.MyEnum>]' + ENUM_ENTRY name:Ok + init: EXPRESSION_BODY + ENUM_CONSTRUCTOR_CALL 'private constructor () [primary] declared in .MyEnum' + ENUM_ENTRY name:Nope + init: EXPRESSION_BODY + ENUM_CONSTRUCTOR_CALL 'private constructor () [primary] declared in .MyEnum' + FUN ENUM_CLASS_SPECIAL_MEMBER name:values visibility:public modality:FINAL <> () returnType:kotlin.Array<.MyEnum> + SYNTHETIC_BODY kind=ENUM_VALUES + FUN ENUM_CLASS_SPECIAL_MEMBER name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:.MyEnum + VALUE_PARAMETER name:value index:0 type:kotlin.String + SYNTHETIC_BODY kind=ENUM_VALUEOF + PROPERTY ENUM_CLASS_SPECIAL_MEMBER name:entries visibility:public modality:FINAL [val] + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.enums.EnumEntries<.MyEnum> + correspondingProperty: PROPERTY ENUM_CLASS_SPECIAL_MEMBER name:entries visibility:public modality:FINAL [val] + SYNTHETIC_BODY kind=ENUM_ENTRIES + FUN FAKE_OVERRIDE name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any [fake_override] + overridden: + protected final fun clone (): kotlin.Any declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum + FUN FAKE_OVERRIDE name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:.MyEnum) returnType:kotlin.Int [fake_override,operator] + overridden: + public final fun compareTo (other: E of kotlin.Enum): kotlin.Int [operator] declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum + VALUE_PARAMETER name:other index:0 type:.MyEnum + FUN FAKE_OVERRIDE name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public final fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int [fake_override] + overridden: + public final fun hashCode (): kotlin.Int declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum + PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL [fake_override,val] + annotations: + IntrinsicConstEvaluation + overridden: + public final name: kotlin.String [val] + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String [fake_override] + correspondingProperty: PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL [fake_override,val] + overridden: + public final fun (): kotlin.String declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum + PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL [fake_override,val] + overridden: + public final ordinal: kotlin.Int [val] + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int [fake_override] + correspondingProperty: PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL [fake_override,val] + overridden: + public final fun (): kotlin.Int declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum + FUN FAKE_OVERRIDE name:getDeclaringClass visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:@[FlexibleNullability] java.lang.Class<@[FlexibleNullability] .MyEnum?>? [fake_override] + overridden: + public final fun getDeclaringClass (): @[FlexibleNullability] java.lang.Class<@[FlexibleNullability] E of kotlin.Enum?>? declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum + FUN name:box visibility:public modality:FINAL <> () returnType:kotlin.enums.EnumEntries<.MyEnum> + annotations: + OptIn(markerClass = [CLASS_REFERENCE 'CLASS IR_EXTERNAL_DECLARATION_STUB ANNOTATION_CLASS name:ExperimentalStdlibApi modality:FINAL visibility:public superTypes:[kotlin.Annotation]' type=kotlin.reflect.KClass]) + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun box (): kotlin.enums.EnumEntries<.MyEnum> declared in ' + CALL 'public final fun (): kotlin.enums.EnumEntries<.MyEnum> declared in .MyEnum' type=kotlin.enums.EnumEntries<.MyEnum> origin=GET_PROPERTY diff --git a/compiler/testData/ir/irText/classes/enumEntries.kt b/compiler/testData/ir/irText/classes/enumEntries.kt new file mode 100644 index 00000000000..fd03b389ae8 --- /dev/null +++ b/compiler/testData/ir/irText/classes/enumEntries.kt @@ -0,0 +1,12 @@ +// FIR_IDENTICAL +// !LANGUAGE: +EnumEntries +// TARGET_BACKEND: JVM_IR +// FULL_JDK +// WITH_STDLIB + +enum class MyEnum { + Ok, Nope +} + +@OptIn(ExperimentalStdlibApi::class) +fun box() = MyEnum.entries diff --git a/compiler/testData/ir/irText/classes/enumEntries.kt.txt b/compiler/testData/ir/irText/classes/enumEntries.kt.txt new file mode 100644 index 00000000000..54d4577e0c6 --- /dev/null +++ b/compiler/testData/ir/irText/classes/enumEntries.kt.txt @@ -0,0 +1,24 @@ +enum class MyEnum : Enum { + private constructor() /* primary */ { + super/*Enum*/() + /* () */ + + } + + Ok = MyEnum() + + Nope = MyEnum() + + fun values(): Array /* Synthetic body for ENUM_VALUES */ + + fun valueOf(value: String): MyEnum /* Synthetic body for ENUM_VALUEOF */ + + val entries: EnumEntries + get + +} + +@OptIn(markerClass = [ExperimentalStdlibApi::class]) +fun box(): EnumEntries { + return () +} diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index 2f742765408..1e9e81cf08e 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -264,6 +264,7 @@ enum class LanguageFeature( GenericInlineClassParameter(sinceVersion = KOTLIN_1_8, kind = UNSTABLE_FEATURE), // KT-32162 DataObjects(KOTLIN_1_8), // KT-4107 LightweightLambdas(KOTLIN_1_8, defaultState = State.DISABLED), + EnumEntries(KOTLIN_1_8, sinceApiVersion = ApiVersion.KOTLIN_1_8, defaultState = State.DISABLED), // KT-48872 // 1.9 diff --git a/core/compiler.common/src/org/jetbrains/kotlin/builtins/StandardNames.kt b/core/compiler.common/src/org/jetbrains/kotlin/builtins/StandardNames.kt index 1ce86b31929..88c81960950 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/builtins/StandardNames.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/builtins/StandardNames.kt @@ -22,6 +22,8 @@ object StandardNames { @JvmField val ENUM_VALUES = Name.identifier("values") + @JvmField val ENUM_ENTRIES = Name.identifier("entries") + @JvmField val ENUM_VALUE_OF = Name.identifier("valueOf") @JvmField val DATA_CLASS_COPY = Name.identifier("copy") diff --git a/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt b/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt index a1f11c0255b..ffbafe158cc 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt @@ -16,6 +16,7 @@ object StandardClassIds { val BASE_INTERNAL_PACKAGE = BASE_KOTLIN_PACKAGE.child(Name.identifier("internal")) val BASE_INTERNAL_IR_PACKAGE = BASE_INTERNAL_PACKAGE.child(Name.identifier("ir")) val BASE_COROUTINES_PACKAGE = BASE_KOTLIN_PACKAGE.child(Name.identifier("coroutines")) + val BASE_ENUMS_PACKAGE = BASE_KOTLIN_PACKAGE.child(Name.identifier("enums")) val builtInsPackages = setOf( BASE_KOTLIN_PACKAGE, @@ -24,7 +25,7 @@ object StandardClassIds { BASE_ANNOTATION_PACKAGE, BASE_REFLECT_PACKAGE, BASE_INTERNAL_PACKAGE, - BASE_COROUTINES_PACKAGE, + BASE_COROUTINES_PACKAGE ) val Nothing = "Nothing".baseId() @@ -134,6 +135,8 @@ object StandardClassIds { val AnnotationRetention = "AnnotationRetention".annotationId() val AnnotationTarget = "AnnotationTarget".annotationId() + val EnumEntries = "EnumEntries".enumsId() + object Annotations { val Suppress = "Suppress".baseId() val PublishedApi = "PublishedApi".baseId() @@ -213,6 +216,7 @@ private fun String.jvmInternalId() = ClassId(StandardClassIds.BASE_JVM_INTERNAL_ private fun String.internalId() = ClassId(StandardClassIds.BASE_INTERNAL_PACKAGE, Name.identifier(this)) private fun String.internalIrId() = ClassId(StandardClassIds.BASE_INTERNAL_IR_PACKAGE, Name.identifier(this)) private fun String.coroutinesId() = ClassId(StandardClassIds.BASE_COROUTINES_PACKAGE, Name.identifier(this)) +private fun String.enumsId() = ClassId(StandardClassIds.BASE_ENUMS_PACKAGE, Name.identifier(this)) private fun String.callableId(packageName: FqName) = CallableId(packageName, Name.identifier(this)) private fun String.callableId(classId: ClassId) = CallableId(classId, Name.identifier(this))