Generate parameter declarations for synthetic members of enum classes

This commit is contained in:
Dmitry Petrov
2017-05-02 15:12:47 +03:00
parent c4346f95ff
commit 17706d0fb6
9 changed files with 21 additions and 7 deletions
@@ -235,7 +235,7 @@ class ClassGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGe
}
private fun generateAdditionalMembersForEnumClass(irClass: IrClass) {
EnumClassMembersGenerator(context).generateSpecialMembers(irClass)
EnumClassMembersGenerator(declarationGenerator).generateSpecialMembers(irClass)
}
private fun generatePrimaryConstructor(irClass: IrClass, ktClassOrObject: KtClassOrObject): IrConstructor? {
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.ir.expressions.IrSyntheticBodyKind
import org.jetbrains.kotlin.ir.expressions.impl.IrSyntheticBodyImpl
import org.jetbrains.kotlin.psi2ir.findFirstFunction
class EnumClassMembersGenerator(override val context: GeneratorContext) : Generator {
class EnumClassMembersGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGeneratorExtension(declarationGenerator) {
fun generateSpecialMembers(irClass: IrClass) {
generateValues(irClass)
generateValueOf(irClass)
@@ -42,8 +42,9 @@ class EnumClassMembersGenerator(override val context: GeneratorContext) : Genera
irClass.startOffset, irClass.endOffset,
IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER,
valuesFunction
).apply {
body = IrSyntheticBodyImpl(irClass.startOffset, irClass.endOffset, IrSyntheticBodyKind.ENUM_VALUES)
).also { irFunction ->
FunctionGenerator(declarationGenerator).generateFunctionParameterDeclarations(irFunction, null, null)
irFunction.body = IrSyntheticBodyImpl(irClass.startOffset, irClass.endOffset, IrSyntheticBodyKind.ENUM_VALUES)
}
)
}
@@ -60,8 +61,9 @@ class EnumClassMembersGenerator(override val context: GeneratorContext) : Genera
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER,
valueOfFunction
).apply {
body = IrSyntheticBodyImpl(irClass.startOffset, irClass.endOffset, IrSyntheticBodyKind.ENUM_VALUEOF)
).also { irFunction ->
FunctionGenerator(declarationGenerator).generateFunctionParameterDeclarations(irFunction, null, null)
irFunction.body = IrSyntheticBodyImpl(irClass.startOffset, irClass.endOffset, IrSyntheticBodyKind.ENUM_VALUEOF)
}
)
}
+1
View File
@@ -74,5 +74,6 @@ FILE /classes.kt
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<TestEnumClass>
SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): TestEnumClass
VALUE_PARAMETER value-parameter value: kotlin.String
SYNTHETIC_BODY kind=ENUM_VALUEOF
+5
View File
@@ -34,6 +34,7 @@ FILE /enum.kt
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<TestEnum1>
SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): TestEnum1
VALUE_PARAMETER value-parameter value: kotlin.String
SYNTHETIC_BODY kind=ENUM_VALUEOF
CLASS ENUM_CLASS TestEnum2
$this: VALUE_PARAMETER this@TestEnum2: TestEnum2
@@ -86,6 +87,7 @@ FILE /enum.kt
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<TestEnum2>
SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): TestEnum2
VALUE_PARAMETER value-parameter value: kotlin.String
SYNTHETIC_BODY kind=ENUM_VALUEOF
CLASS ENUM_CLASS TestEnum3
$this: VALUE_PARAMETER this@TestEnum3: TestEnum3
@@ -155,6 +157,7 @@ FILE /enum.kt
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<TestEnum3>
SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): TestEnum3
VALUE_PARAMETER value-parameter value: kotlin.String
SYNTHETIC_BODY kind=ENUM_VALUEOF
CLASS ENUM_CLASS TestEnum4
$this: VALUE_PARAMETER this@TestEnum4: TestEnum4
@@ -292,6 +295,7 @@ FILE /enum.kt
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<TestEnum4>
SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): TestEnum4
VALUE_PARAMETER value-parameter value: kotlin.String
SYNTHETIC_BODY kind=ENUM_VALUEOF
CLASS ENUM_CLASS TestEnum5
$this: VALUE_PARAMETER this@TestEnum5: TestEnum5
@@ -344,5 +348,6 @@ FILE /enum.kt
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<TestEnum5>
SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): TestEnum5
VALUE_PARAMETER value-parameter value: kotlin.String
SYNTHETIC_BODY kind=ENUM_VALUEOF
@@ -47,6 +47,7 @@ FILE /enumWithSecondaryCtor.kt
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<Test0>
SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): Test0
VALUE_PARAMETER value-parameter value: kotlin.String
SYNTHETIC_BODY kind=ENUM_VALUEOF
CLASS ENUM_CLASS Test1
$this: VALUE_PARAMETER this@Test1: Test1
@@ -99,6 +100,7 @@ FILE /enumWithSecondaryCtor.kt
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<Test1>
SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): Test1
VALUE_PARAMETER value-parameter value: kotlin.String
SYNTHETIC_BODY kind=ENUM_VALUEOF
CLASS ENUM_CLASS Test2
$this: VALUE_PARAMETER this@Test2: Test2
@@ -225,5 +227,6 @@ FILE /enumWithSecondaryCtor.kt
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<Test2>
SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): Test2
VALUE_PARAMETER value-parameter value: kotlin.String
SYNTHETIC_BODY kind=ENUM_VALUEOF
@@ -89,6 +89,7 @@ FILE /enumEntryAsReceiver.kt
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<X>
SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): X
VALUE_PARAMETER value-parameter value: kotlin.String
SYNTHETIC_BODY kind=ENUM_VALUEOF
FUN public fun box(): kotlin.String
BLOCK_BODY
@@ -45,6 +45,7 @@ FILE /objectAsCallable.kt
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<En>
SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): En
VALUE_PARAMETER value-parameter value: kotlin.String
SYNTHETIC_BODY kind=ENUM_VALUEOF
FUN public operator fun A.invoke(i: kotlin.Int): kotlin.Int
$receiver: VALUE_PARAMETER this@invoke: A
@@ -78,4 +79,3 @@ FILE /objectAsCallable.kt
BLOCK_BODY
RETURN type=kotlin.Nothing from='<get-test2>(): Int'
GET_FIELD 'test2: Int' type=kotlin.Int origin=null
+1
View File
@@ -32,6 +32,7 @@ FILE /values.kt
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<Enum>
SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): Enum
VALUE_PARAMETER value-parameter value: kotlin.String
SYNTHETIC_BODY kind=ENUM_VALUEOF
CLASS OBJECT A
$this: VALUE_PARAMETER this@A: A
+1
View File
@@ -81,5 +81,6 @@ FILE /enumEntry.kt
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<Z>
SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): Z
VALUE_PARAMETER value-parameter value: kotlin.String
SYNTHETIC_BODY kind=ENUM_VALUEOF