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) { private fun generateAdditionalMembersForEnumClass(irClass: IrClass) {
EnumClassMembersGenerator(context).generateSpecialMembers(irClass) EnumClassMembersGenerator(declarationGenerator).generateSpecialMembers(irClass)
} }
private fun generatePrimaryConstructor(irClass: IrClass, ktClassOrObject: KtClassOrObject): IrConstructor? { 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.ir.expressions.impl.IrSyntheticBodyImpl
import org.jetbrains.kotlin.psi2ir.findFirstFunction import org.jetbrains.kotlin.psi2ir.findFirstFunction
class EnumClassMembersGenerator(override val context: GeneratorContext) : Generator { class EnumClassMembersGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGeneratorExtension(declarationGenerator) {
fun generateSpecialMembers(irClass: IrClass) { fun generateSpecialMembers(irClass: IrClass) {
generateValues(irClass) generateValues(irClass)
generateValueOf(irClass) generateValueOf(irClass)
@@ -42,8 +42,9 @@ class EnumClassMembersGenerator(override val context: GeneratorContext) : Genera
irClass.startOffset, irClass.endOffset, irClass.startOffset, irClass.endOffset,
IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER, IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER,
valuesFunction valuesFunction
).apply { ).also { irFunction ->
body = IrSyntheticBodyImpl(irClass.startOffset, irClass.endOffset, IrSyntheticBodyKind.ENUM_VALUES) 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, UNDEFINED_OFFSET, UNDEFINED_OFFSET,
IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER, IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER,
valueOfFunction valueOfFunction
).apply { ).also { irFunction ->
body = IrSyntheticBodyImpl(irClass.startOffset, irClass.endOffset, IrSyntheticBodyKind.ENUM_VALUEOF) 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> FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<TestEnumClass>
SYNTHETIC_BODY kind=ENUM_VALUES SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): TestEnumClass 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 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> FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<TestEnum1>
SYNTHETIC_BODY kind=ENUM_VALUES SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): TestEnum1 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 SYNTHETIC_BODY kind=ENUM_VALUEOF
CLASS ENUM_CLASS TestEnum2 CLASS ENUM_CLASS TestEnum2
$this: VALUE_PARAMETER this@TestEnum2: 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> FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<TestEnum2>
SYNTHETIC_BODY kind=ENUM_VALUES SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): TestEnum2 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 SYNTHETIC_BODY kind=ENUM_VALUEOF
CLASS ENUM_CLASS TestEnum3 CLASS ENUM_CLASS TestEnum3
$this: VALUE_PARAMETER this@TestEnum3: 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> FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<TestEnum3>
SYNTHETIC_BODY kind=ENUM_VALUES SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): TestEnum3 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 SYNTHETIC_BODY kind=ENUM_VALUEOF
CLASS ENUM_CLASS TestEnum4 CLASS ENUM_CLASS TestEnum4
$this: VALUE_PARAMETER this@TestEnum4: 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> FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<TestEnum4>
SYNTHETIC_BODY kind=ENUM_VALUES SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): TestEnum4 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 SYNTHETIC_BODY kind=ENUM_VALUEOF
CLASS ENUM_CLASS TestEnum5 CLASS ENUM_CLASS TestEnum5
$this: VALUE_PARAMETER this@TestEnum5: 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> FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<TestEnum5>
SYNTHETIC_BODY kind=ENUM_VALUES SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): TestEnum5 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 SYNTHETIC_BODY kind=ENUM_VALUEOF
@@ -47,6 +47,7 @@ FILE /enumWithSecondaryCtor.kt
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<Test0> FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<Test0>
SYNTHETIC_BODY kind=ENUM_VALUES SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): Test0 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 SYNTHETIC_BODY kind=ENUM_VALUEOF
CLASS ENUM_CLASS Test1 CLASS ENUM_CLASS Test1
$this: VALUE_PARAMETER this@Test1: 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> FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<Test1>
SYNTHETIC_BODY kind=ENUM_VALUES SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): Test1 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 SYNTHETIC_BODY kind=ENUM_VALUEOF
CLASS ENUM_CLASS Test2 CLASS ENUM_CLASS Test2
$this: VALUE_PARAMETER this@Test2: 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> FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<Test2>
SYNTHETIC_BODY kind=ENUM_VALUES SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): Test2 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 SYNTHETIC_BODY kind=ENUM_VALUEOF
@@ -89,6 +89,7 @@ FILE /enumEntryAsReceiver.kt
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<X> FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<X>
SYNTHETIC_BODY kind=ENUM_VALUES SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): X 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 SYNTHETIC_BODY kind=ENUM_VALUEOF
FUN public fun box(): kotlin.String FUN public fun box(): kotlin.String
BLOCK_BODY BLOCK_BODY
@@ -45,6 +45,7 @@ FILE /objectAsCallable.kt
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<En> FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<En>
SYNTHETIC_BODY kind=ENUM_VALUES SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): En 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 SYNTHETIC_BODY kind=ENUM_VALUEOF
FUN public operator fun A.invoke(i: kotlin.Int): kotlin.Int FUN public operator fun A.invoke(i: kotlin.Int): kotlin.Int
$receiver: VALUE_PARAMETER this@invoke: A $receiver: VALUE_PARAMETER this@invoke: A
@@ -78,4 +79,3 @@ FILE /objectAsCallable.kt
BLOCK_BODY BLOCK_BODY
RETURN type=kotlin.Nothing from='<get-test2>(): Int' RETURN type=kotlin.Nothing from='<get-test2>(): Int'
GET_FIELD 'test2: Int' type=kotlin.Int origin=null 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> FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<Enum>
SYNTHETIC_BODY kind=ENUM_VALUES SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): Enum 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 SYNTHETIC_BODY kind=ENUM_VALUEOF
CLASS OBJECT A CLASS OBJECT A
$this: VALUE_PARAMETER this@A: 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> FUN ENUM_CLASS_SPECIAL_MEMBER public final fun values(): kotlin.Array<Z>
SYNTHETIC_BODY kind=ENUM_VALUES SYNTHETIC_BODY kind=ENUM_VALUES
FUN ENUM_CLASS_SPECIAL_MEMBER public final fun valueOf(value: kotlin.String): Z 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 SYNTHETIC_BODY kind=ENUM_VALUEOF