From 9cfff757c8778ab54518edd3fe4b1e08ae04459a Mon Sep 17 00:00:00 2001 From: vvlevchenko Date: Tue, 28 Feb 2017 18:41:27 +0300 Subject: [PATCH] IR: enum prevent loosing IrExpressionBody on lowering of enums (#279) * IR: enum prevent loosing IrExpressionBody on lowering of enums * IR: refactoring * IR: refactoring : return it back * IR: remove 'it' --- .../backend/konan/lower/EnumClassLowering.kt | 41 ++++++++++++++++--- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt index aa93dc26a7c..d64b9dd1dfd 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt @@ -115,6 +115,7 @@ internal class EnumClassLowering(val context: Context) : ClassLoweringPass { private inner class EnumClassTransformer(val irClass: IrClass) { private val enumEntryOrdinals = mutableMapOf() private val loweredEnumConstructors = mutableMapOf() + private val descriptorToIrConstructorWithDefaultArguments = mutableMapOf() private val defaultEnumEntryConstructors = mutableMapOf() private val loweredEnumConstructorParameters = mutableMapOf() @@ -174,6 +175,16 @@ internal class EnumClassLowering(val context: Context) : ClassLoweringPass { constructors.add(constructorDescriptor) defaultClass.declarations.add(constructor) defaultEnumEntryConstructors.put(loweredEnumConstructor, constructorDescriptor) + + val irConstructor = descriptorToIrConstructorWithDefaultArguments[loweredEnumConstructor] + if (irConstructor != null) { + it.valueParameters.filter { it.declaresDefaultValue() }.forEach { argument -> + val loweredArgument = loweredEnumConstructor.valueParameters[argument.loweredIndex()] + val body = irConstructor.getDefault(loweredArgument)!! + body.transformChildrenVoid(ParameterMapper(constructorDescriptor)) + constructor.putDefault(constructorDescriptor.valueParameters[loweredArgument.index], body) + } + } } val memberScope = SimpleMemberScope(irClass.descriptor.unsubstitutedMemberScope.getContributedDescriptors().toList()) @@ -274,7 +285,6 @@ internal class EnumClassLowering(val context: Context) : ClassLoweringPass { ) ) val constructor = IrConstructorImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.DEFINED, constructorDescriptor, body) - return Pair(constructorDescriptor, constructor) } @@ -392,6 +402,12 @@ internal class EnumClassLowering(val context: Context) : ClassLoweringPass { loweredConstructorDescriptor, enumConstructor.body!! // will be transformed later ) + enumConstructor.descriptor.valueParameters.filter { it.declaresDefaultValue() }.forEach { + val body = enumConstructor.getDefault(it)!! + body.transformChildrenVoid(ParameterMapper(constructorDescriptor)) + loweredEnumConstructor.putDefault(loweredConstructorDescriptor.valueParameters[it.loweredIndex()], body) + descriptorToIrConstructorWithDefaultArguments[loweredConstructorDescriptor] = loweredEnumConstructor + } return loweredEnumConstructor } @@ -427,7 +443,7 @@ internal class EnumClassLowering(val context: Context) : ClassLoweringPass { val loweredValueParameterDescriptor = valueParameterDescriptor.copy( loweredConstructorDescriptor, valueParameterDescriptor.name, - valueParameterDescriptor.index + 2 + valueParameterDescriptor.loweredIndex() ) loweredEnumConstructorParameters[valueParameterDescriptor] = loweredValueParameterDescriptor return loweredValueParameterDescriptor @@ -479,8 +495,7 @@ internal class EnumClassLowering(val context: Context) : ClassLoweringPass { result.putValueArgument(1, IrGetValueImpl(startOffset, endOffset, enumClassConstructor.valueParameters[1])) descriptor.valueParameters.forEach { valueParameter -> - val i = valueParameter.index - result.putValueArgument(i + 2, delegatingConstructorCall.getValueArgument(i)) + result.putValueArgument(valueParameter.loweredIndex(), delegatingConstructorCall.getValueArgument(valueParameter)) } return result @@ -600,4 +615,20 @@ internal class EnumClassLowering(val context: Context) : ClassLoweringPass { } } } -} \ No newline at end of file +} + +private fun ValueParameterDescriptor.loweredIndex(): Int = index + 2 + +private class ParameterMapper(val originalDescriptor:FunctionDescriptor): IrElementTransformerVoid() { + override fun visitGetValue(expression: IrGetValue): IrExpression { + val descriptor = expression.descriptor + when(descriptor) { + is ValueParameterDescriptor -> { + return IrGetValueImpl(expression.startOffset, + expression.endOffset, + originalDescriptor.valueParameters[descriptor.index]) + } + } + return expression + } +}