[FIR] Add values and valueOf to deserialized enums

This commit is contained in:
Dmitriy Novozhilov
2020-03-13 17:00:52 +03:00
parent caec5fe352
commit 3765a1efaf
19 changed files with 127 additions and 0 deletions
@@ -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))
+6
View File
@@ -364,6 +364,12 @@ public final enum class DeprecationLevel : R|kotlin/Enum<kotlin/DeprecationLevel
public final static enum entry WARNING: R|kotlin/DeprecationLevel|
public final static enum entry ERROR: R|kotlin/DeprecationLevel|
public final static enum entry HIDDEN: R|kotlin/DeprecationLevel|
public final static fun values(): R|kotlin/Array<kotlin/DeprecationLevel>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|kotlin/DeprecationLevel| {
}
}
public final class Double : R|kotlin/Number|, R|kotlin/Comparable<kotlin/Double>| {
@@ -7,6 +7,12 @@ public final enum class E : R|kotlin/Enum<test/E>| {
private constructor(): R|test/E|
public final static enum entry ENTRY: R|test/E|
public final static fun values(): R|kotlin/Array<test/E>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|test/E| {
}
}
public final annotation class EnumOption : R|kotlin/Annotation| {
@@ -2,6 +2,12 @@ public final enum class E : R|kotlin/Enum<test/E>| {
private constructor(): R|test/E|
public final static enum entry CAKE: R|test/E|
public final static fun values(): R|kotlin/Array<test/E>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|test/E| {
}
}
public final annotation class EnumAnno : R|kotlin/Annotation| {
@@ -21,5 +21,11 @@ public final enum class Eee : R|kotlin/Enum<test/Eee>| {
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<test/Eee>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|test/Eee| {
}
}
@@ -17,4 +17,11 @@ public final enum class E : R|kotlin/Enum<test/E>| {
private constructor(x: R|kotlin/String|, y: R|kotlin/Int|): R|test/E|
public final static fun values(): R|kotlin/Array<test/E>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|test/E| {
}
}
@@ -1,4 +1,11 @@
public final enum class EnumWithGenericConstructorParameter : R|kotlin/Enum<test/EnumWithGenericConstructorParameter>| {
private constructor(list: R|kotlin/collections/List<kotlin/String>?|): R|test/EnumWithGenericConstructorParameter|
public final static fun values(): R|kotlin/Array<test/EnumWithGenericConstructorParameter>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|test/EnumWithGenericConstructorParameter| {
}
}
@@ -1,4 +1,11 @@
public final enum class EnumWithPrimitiveConstructorParameter : R|kotlin/Enum<test/EnumWithPrimitiveConstructorParameter>| {
private constructor(b: R|kotlin/Boolean|): R|test/EnumWithPrimitiveConstructorParameter|
public final static fun values(): R|kotlin/Array<test/EnumWithPrimitiveConstructorParameter>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|test/EnumWithPrimitiveConstructorParameter| {
}
}
@@ -2,17 +2,35 @@ internal final enum class In : R|kotlin/Enum<test/In>| {
private constructor(): R|test/In|
public final static enum entry A: R|test/In|
public final static fun values(): R|kotlin/Array<test/In>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|test/In| {
}
}
private final enum class Pr : R|kotlin/Enum<test/Pr>| {
private constructor(): R|test/Pr|
public final static enum entry A: R|test/Pr|
public final static fun values(): R|kotlin/Array<test/Pr>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|test/Pr| {
}
}
public final enum class Pu : R|kotlin/Enum<test/Pu>| {
private constructor(): R|test/Pu|
public final static enum entry A: R|test/Pu|
public final static fun values(): R|kotlin/Array<test/Pu>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|test/Pu| {
}
}
@@ -10,5 +10,11 @@ public final enum class En : R|kotlin/Enum<test/En>| {
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<test/En>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|test/En| {
}
}
@@ -21,5 +21,11 @@ public final enum class Enum : R|kotlin/Enum<test/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<test/Enum>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|test/Enum| {
}
}
@@ -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<test/A.E>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|test/A.E| {
}
}
}
@@ -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<test/A.E>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|test/A.E| {
}
}
}
@@ -2,5 +2,11 @@ public final enum class MyEnum : R|kotlin/Enum<test/MyEnum>| {
private constructor(): R|test/MyEnum|
public final static enum entry ENTRY: R|test/MyEnum|
public final static fun values(): R|kotlin/Array<test/MyEnum>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|test/MyEnum| {
}
}
@@ -3,5 +3,11 @@ public final enum class Test : R|kotlin/Enum<test/Test>| {
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<test/Test>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|test/Test| {
}
}
@@ -9,5 +9,11 @@ public final enum class E : R|kotlin/Enum<test/E>| {
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<test/E>| {
}
public final static fun valueOf(value: R|kotlin/String|): R|test/E| {
}
}
@@ -0,0 +1,4 @@
fun test() {
val values = AnnotationTarget.values()
val entry = AnnotationTarget.valueOf("CLASS")
}
@@ -0,0 +1,5 @@
FILE: enumValuesDeserialized.kt
public final fun test(): R|kotlin/Unit| {
lval values: R|kotlin/Array<kotlin/annotation/AnnotationTarget>| = 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))
}
@@ -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");