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 fdc82b34b5a..785249f8301 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 @@ -854,8 +854,8 @@ class Fir2IrDeclarationStorage( containingClass: ConeClassLikeLookupTag? = (irParent as? IrClass)?.classId?.let { ConeClassLikeLookupTagImpl(it) }, forceTopLevelPrivate: Boolean = false, ): IrProperty = convertCatching(property) { - val origin = if (property.isStatic && property.name in ENUM_SYNTHETIC_NAMES) - IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER + 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 = @@ -934,6 +934,7 @@ class Fir2IrDeclarationStorage( getter, property, this, type, irParent, thisReceiverOwner, false, when { origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB -> origin + origin == IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER -> origin delegate != null -> IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR getter is FirDefaultPropertyGetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR else -> origin 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 6813cfdd88d..b874ef90098 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 @@ -170,7 +170,8 @@ internal class ClassMemberGenerator( 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) + val name = (irFunction as? IrSimpleFunction)?.correspondingPropertySymbol?.owner?.name ?: irFunction.name + val kind = Fir2IrDeclarationStorage.ENUM_SYNTHETIC_NAMES.getValue(name) irFunction.body = IrSyntheticBodyImpl(startOffset, endOffset, kind) } irFunction.parent is IrClass && irFunction.parentAsClass.isData -> { diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/EnumClassMembersGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/EnumClassMembersGenerator.kt index 699492a2baa..c56c1c24bab 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/EnumClassMembersGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/EnumClassMembersGenerator.kt @@ -94,7 +94,7 @@ class EnumClassMembersGenerator(declarationGenerator: DeclarationGenerator) : De ).also { irProperty -> irProperty.getter = context.symbolTable.declareSimpleFunctionWithOverrides( SYNTHETIC_OFFSET, SYNTHETIC_OFFSET, - IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR, + IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER, entriesProperty.getter!! ).also { getter -> getter.correspondingPropertySymbol = irProperty.symbol diff --git a/compiler/testData/codegen/bytecodeListing/enumEntries.txt b/compiler/testData/codegen/bytecodeListing/enumEntries.txt index 15ad6398f87..662d80af511 100644 --- a/compiler/testData/codegen/bytecodeListing/enumEntries.txt +++ b/compiler/testData/codegen/bytecodeListing/enumEntries.txt @@ -16,7 +16,7 @@ public final enum class SimpleEnum { private synthetic final static method $values(): SimpleEnum[] static method (): void private method (p0: java.lang.String, p1: int): void - public final static @org.jetbrains.annotations.NotNull method getEntries(): kotlin.enums.EnumEntries + public static method getEntries(): kotlin.enums.EnumEntries public static method valueOf(p0: java.lang.String): SimpleEnum public static method values(): SimpleEnum[] } @@ -32,7 +32,7 @@ public final enum class WithAnnotations { private synthetic final static method $values(): WithAnnotations[] static method (): void private method (p0: java.lang.String, p1: int): void - public final static @org.jetbrains.annotations.NotNull method getEntries(): kotlin.enums.EnumEntries + public static method getEntries(): kotlin.enums.EnumEntries public static method valueOf(p0: java.lang.String): WithAnnotations public static method values(): WithAnnotations[] } @@ -50,7 +50,7 @@ public final enum class WithConstructor { private synthetic final static method $values(): WithConstructor[] static method (): void private method (p0: java.lang.String, p1: int, p2: java.lang.String): void - public final static @org.jetbrains.annotations.NotNull method getEntries(): kotlin.enums.EnumEntries + public static method getEntries(): kotlin.enums.EnumEntries public final @org.jetbrains.annotations.NotNull method getX(): java.lang.String public static method valueOf(p0: java.lang.String): WithConstructor public static method values(): WithConstructor[] @@ -77,7 +77,7 @@ public abstract enum class WithEntryClass { private method (p0: java.lang.String, p1: int): void public synthetic method (p0: java.lang.String, p1: int, p2: kotlin.jvm.internal.DefaultConstructorMarker): void public abstract method foo(): void - public final static @org.jetbrains.annotations.NotNull method getEntries(): kotlin.enums.EnumEntries + public static method getEntries(): kotlin.enums.EnumEntries public static method valueOf(p0: java.lang.String): WithEntryClass public static method values(): WithEntryClass[] } diff --git a/compiler/testData/codegen/bytecodeText/enum/enumEntries.kt b/compiler/testData/codegen/bytecodeText/enum/enumEntries.kt index 97687302431..8b7e1596e1a 100644 --- a/compiler/testData/codegen/bytecodeText/enum/enumEntries.kt +++ b/compiler/testData/codegen/bytecodeText/enum/enumEntries.kt @@ -8,6 +8,6 @@ enum class MyEnum { // 1 INVOKEDYNAMIC // 1 kotlin.enums.EnumEntries getEntries\(\) // 1 private final static synthetic Lkotlin/enums/EnumEntries; \$ENTRIES -// 1 public final static getEntries\(\)Lkotlin/enums/EnumEntries; +// 1 public static getEntries\(\)Lkotlin/enums/EnumEntries; // 0 [^\$]entries // 0 class [a-zA-Z]+\$EntriesMappings diff --git a/compiler/testData/ir/irText/classes/enumEntries.fir.ir.txt b/compiler/testData/ir/irText/classes/enumEntries.fir.ir.txt index d4d800e7f6b..32e415ac80d 100644 --- a/compiler/testData/ir/irText/classes/enumEntries.fir.ir.txt +++ b/compiler/testData/ir/irText/classes/enumEntries.fir.ir.txt @@ -18,7 +18,7 @@ FILE fqName: fileName:/enumEntries.kt 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> + FUN ENUM_CLASS_SPECIAL_MEMBER 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] diff --git a/compiler/testData/ir/irText/classes/enumEntries.fir.kt.txt b/compiler/testData/ir/irText/classes/enumEntries.fir.kt.txt index 54d4577e0c6..2b6b2b1323c 100644 --- a/compiler/testData/ir/irText/classes/enumEntries.fir.kt.txt +++ b/compiler/testData/ir/irText/classes/enumEntries.fir.kt.txt @@ -14,7 +14,7 @@ enum class MyEnum : Enum { fun valueOf(value: String): MyEnum /* Synthetic body for ENUM_VALUEOF */ val entries: EnumEntries - get + get(): EnumEntries /* Synthetic body for ENUM_ENTRIES */ } diff --git a/compiler/testData/ir/irText/classes/enumEntries.ir.txt b/compiler/testData/ir/irText/classes/enumEntries.ir.txt index 2d6ae19d9b5..77f27e46e05 100644 --- a/compiler/testData/ir/irText/classes/enumEntries.ir.txt +++ b/compiler/testData/ir/irText/classes/enumEntries.ir.txt @@ -66,7 +66,7 @@ FILE fqName: fileName:/enumEntries.kt 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> + FUN ENUM_CLASS_SPECIAL_MEMBER 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 name:box visibility:public modality:FINAL <> () returnType:kotlin.enums.EnumEntries<.MyEnum> diff --git a/compiler/testData/ir/irText/classes/enumEntries.kt.txt b/compiler/testData/ir/irText/classes/enumEntries.kt.txt index 54d4577e0c6..2b6b2b1323c 100644 --- a/compiler/testData/ir/irText/classes/enumEntries.kt.txt +++ b/compiler/testData/ir/irText/classes/enumEntries.kt.txt @@ -14,7 +14,7 @@ enum class MyEnum : Enum { fun valueOf(value: String): MyEnum /* Synthetic body for ENUM_VALUEOF */ val entries: EnumEntries - get + get(): EnumEntries /* Synthetic body for ENUM_ENTRIES */ }