diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt index 1f292378859..634e490d14e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/deserialization/ClassDeserialization.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.deserialization import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.FirSession @@ -14,6 +15,8 @@ import org.jetbrains.kotlin.fir.declarations.addDeclarations import org.jetbrains.kotlin.fir.declarations.builder.* import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall +import org.jetbrains.kotlin.fir.generateValueOfFunction +import org.jetbrains.kotlin.fir.generateValuesFunction import org.jetbrains.kotlin.fir.resolve.impl.FirClonableSymbolProvider.Companion.CLONE import org.jetbrains.kotlin.fir.resolve.impl.FirClonableSymbolProvider.Companion.CLONABLE_CLASS_ID import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider @@ -130,6 +133,11 @@ fun deserializeClassToSymbol( } ) + if (classKind == ClassKind.ENUM_CLASS) { + generateValuesFunction(session, classId.packageFqName, classId.relativeClassName) + generateValueOfFunction(session, classId.packageFqName, classId.relativeClassName) + } + if (isSealed) { classProto.sealedSubclassFqNameList.mapTo((this as FirSealedClassBuilder).inheritors) { ClassId.fromString(nameResolver.getQualifiedClassName(it)) diff --git a/compiler/fir/resolve/testData/builtIns/kotlin.txt b/compiler/fir/resolve/testData/builtIns/kotlin.txt index 24b70eccc37..612256ff7c3 100644 --- a/compiler/fir/resolve/testData/builtIns/kotlin.txt +++ b/compiler/fir/resolve/testData/builtIns/kotlin.txt @@ -364,6 +364,12 @@ public final enum class DeprecationLevel : R|kotlin/Enum| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|kotlin/DeprecationLevel| { + } + } public final class Double : R|kotlin/Number|, R|kotlin/Comparable| { diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/AnnotationInAnnotationArguments.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/AnnotationInAnnotationArguments.txt index a19602ba3d9..ff250445058 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/AnnotationInAnnotationArguments.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/AnnotationInAnnotationArguments.txt @@ -7,6 +7,12 @@ public final enum class E : R|kotlin/Enum| { private constructor(): R|test/E| public final static enum entry ENTRY: R|test/E| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/E| { + } + } public final annotation class EnumOption : R|kotlin/Annotation| { diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/EnumArgumentWithCustomToString.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/EnumArgumentWithCustomToString.txt index b6ab536585c..7adc2cc6795 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/EnumArgumentWithCustomToString.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/EnumArgumentWithCustomToString.txt @@ -2,6 +2,12 @@ public final enum class E : R|kotlin/Enum| { private constructor(): R|test/E| public final static enum entry CAKE: R|test/E| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/E| { + } + } public final annotation class EnumAnno : R|kotlin/Annotation| { diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/classMembers/EnumEntry.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/classMembers/EnumEntry.txt index bf081b096de..8b8faad55ab 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/classMembers/EnumEntry.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/classMembers/EnumEntry.txt @@ -21,5 +21,11 @@ public final enum class Eee : R|kotlin/Enum| { public final static enum entry Entry2: R|test/Eee| public final static enum entry Entry3: R|test/Eee| public final static enum entry Entry4: R|test/Eee| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/Eee| { + } + } diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/parameters/EnumConstructor.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/parameters/EnumConstructor.txt index fa635f49a7c..b53f0e322db 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/parameters/EnumConstructor.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/annotations/parameters/EnumConstructor.txt @@ -17,4 +17,11 @@ public final enum class E : R|kotlin/Enum| { private constructor(x: R|kotlin/String|, y: R|kotlin/Int|): R|test/E| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/E| { + } + } + diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/class/EnumWithGenericConstructorParameter.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/class/EnumWithGenericConstructorParameter.txt index 08a2afdeab7..0ee8d11cb0e 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/class/EnumWithGenericConstructorParameter.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/class/EnumWithGenericConstructorParameter.txt @@ -1,4 +1,11 @@ public final enum class EnumWithGenericConstructorParameter : R|kotlin/Enum| { private constructor(list: R|kotlin/collections/List?|): R|test/EnumWithGenericConstructorParameter| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/EnumWithGenericConstructorParameter| { + } + } + diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/class/EnumWithPrimitiveConstructorParameter.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/class/EnumWithPrimitiveConstructorParameter.txt index 90d7c1e17bd..add332927ff 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/class/EnumWithPrimitiveConstructorParameter.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/class/EnumWithPrimitiveConstructorParameter.txt @@ -1,4 +1,11 @@ public final enum class EnumWithPrimitiveConstructorParameter : R|kotlin/Enum| { private constructor(b: R|kotlin/Boolean|): R|test/EnumWithPrimitiveConstructorParameter| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/EnumWithPrimitiveConstructorParameter| { + } + } + diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumVisibility.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumVisibility.txt index 5ca4878af1b..c8a3060cdc1 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumVisibility.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumVisibility.txt @@ -2,17 +2,35 @@ internal final enum class In : R|kotlin/Enum| { private constructor(): R|test/In| public final static enum entry A: R|test/In| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/In| { + } + } private final enum class Pr : R|kotlin/Enum| { private constructor(): R|test/Pr| public final static enum entry A: R|test/Pr| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/Pr| { + } + } public final enum class Pu : R|kotlin/Enum| { private constructor(): R|test/Pu| public final static enum entry A: R|test/Pu| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/Pu| { + } + } diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumWithConstuctor.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumWithConstuctor.txt index cded75f09af..2f528692a59 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumWithConstuctor.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumWithConstuctor.txt @@ -10,5 +10,11 @@ public final enum class En : R|kotlin/Enum| { public final static enum entry E1: R|test/En| public final static enum entry E2: R|test/En| public final static enum entry E3: R|test/En| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/En| { + } + } diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumWithInnerClasses.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumWithInnerClasses.txt index ad208dec6c2..6d879780395 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumWithInnerClasses.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/EnumWithInnerClasses.txt @@ -21,5 +21,11 @@ public final enum class Enum : R|kotlin/Enum| { public final static enum entry ENTRY1: R|test/Enum| public final static enum entry ENTRY2: R|test/Enum| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/Enum| { + } + } diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/InnerEnum.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/InnerEnum.txt index 1fe0a5aa70e..9148bb743d9 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/InnerEnum.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/InnerEnum.txt @@ -5,6 +5,12 @@ public final class A : R|kotlin/Any| { private constructor(): R|test/A.E| public final static enum entry ENTRY: R|test/A.E| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/A.E| { + } + } } diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/InnerEnumExistingClassObject.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/InnerEnumExistingClassObject.txt index abe18dcabd8..fd10b0cdce7 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/InnerEnumExistingClassObject.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/InnerEnumExistingClassObject.txt @@ -10,6 +10,12 @@ public final class A : R|kotlin/Any| { private constructor(): R|test/A.E| public final static enum entry ENTRY: R|test/A.E| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/A.E| { + } + } } diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/SimpleEnum.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/SimpleEnum.txt index 1b721953a87..728ab3d0d32 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/enum/SimpleEnum.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/enum/SimpleEnum.txt @@ -2,5 +2,11 @@ public final enum class MyEnum : R|kotlin/Enum| { private constructor(): R|test/MyEnum| public final static enum entry ENTRY: R|test/MyEnum| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/MyEnum| { + } + } diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/fromLoadJava/Enum.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/fromLoadJava/Enum.txt index fd1e1ab3c29..e2f0e34acc5 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/fromLoadJava/Enum.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/fromLoadJava/Enum.txt @@ -3,5 +3,11 @@ public final enum class Test : R|kotlin/Enum| { public final static enum entry A: R|test/Test| public final static enum entry B: R|test/Test| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/Test| { + } + } diff --git a/compiler/fir/resolve/testData/loadCompiledKotlin/memberOrder/EnumEntries.txt b/compiler/fir/resolve/testData/loadCompiledKotlin/memberOrder/EnumEntries.txt index 418af378d26..29f31917181 100644 --- a/compiler/fir/resolve/testData/loadCompiledKotlin/memberOrder/EnumEntries.txt +++ b/compiler/fir/resolve/testData/loadCompiledKotlin/memberOrder/EnumEntries.txt @@ -9,5 +9,11 @@ public final enum class E : R|kotlin/Enum| { public final static enum entry SIX: R|test/E| public final static enum entry SEVEN: R|test/E| public final static enum entry EIGHT: R|test/E| + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|test/E| { + } + } diff --git a/compiler/fir/resolve/testData/resolveWithStdlib/enumValuesDeserialized.kt b/compiler/fir/resolve/testData/resolveWithStdlib/enumValuesDeserialized.kt new file mode 100644 index 00000000000..8714f48271c --- /dev/null +++ b/compiler/fir/resolve/testData/resolveWithStdlib/enumValuesDeserialized.kt @@ -0,0 +1,4 @@ +fun test() { + val values = AnnotationTarget.values() + val entry = AnnotationTarget.valueOf("CLASS") +} \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolveWithStdlib/enumValuesDeserialized.txt b/compiler/fir/resolve/testData/resolveWithStdlib/enumValuesDeserialized.txt new file mode 100644 index 00000000000..17d1a9b3dc6 --- /dev/null +++ b/compiler/fir/resolve/testData/resolveWithStdlib/enumValuesDeserialized.txt @@ -0,0 +1,5 @@ +FILE: enumValuesDeserialized.kt + public final fun test(): R|kotlin/Unit| { + lval values: R|kotlin/Array| = Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.values|() + lval entry: R|kotlin/annotation/AnnotationTarget| = Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.valueOf|(String(CLASS)) + } diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java index df2c7ba2ac7..aedaffb527d 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithStdlibTestGenerated.java @@ -88,6 +88,11 @@ public class FirDiagnosticsWithStdlibTestGenerated extends AbstractFirDiagnostic runTest("compiler/fir/resolve/testData/resolveWithStdlib/emptyArray.kt"); } + @TestMetadata("enumValuesDeserialized.kt") + public void testEnumValuesDeserialized() throws Exception { + runTest("compiler/fir/resolve/testData/resolveWithStdlib/enumValuesDeserialized.kt"); + } + @TestMetadata("exception.kt") public void testException() throws Exception { runTest("compiler/fir/resolve/testData/resolveWithStdlib/exception.kt");