From e965a2b3b5f319be6c9cbda4fdf34600d281962b Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Wed, 5 Oct 2016 12:55:28 +0300 Subject: [PATCH] Further SyntheticJavaPropertyDescriptor support --- .../ConstAndJvmFieldPropertiesLowering.kt | 54 ++++++++++++------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ConstAndJvmFieldPropertiesLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ConstAndJvmFieldPropertiesLowering.kt index fa82e237371..bece3402ddb 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ConstAndJvmFieldPropertiesLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ConstAndJvmFieldPropertiesLowering.kt @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid +import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor class ConstAndJvmFieldPropertiesLowering : IrElementTransformerVoid(), FileLoweringPass { override fun lower(irFile: IrFile) { @@ -58,29 +59,46 @@ class ConstAndJvmFieldPropertiesLowering : IrElementTransformerVoid(), FileLower override fun visitCall(expression: IrCall): IrExpression { val descriptor = expression.descriptor - if (descriptor is PropertyAccessorDescriptor && JvmCodegenUtil.isConstOrHasJvmFieldAnnotation(descriptor.correspondingProperty)) { + if (descriptor !is PropertyAccessorDescriptor) { + return super.visitCall(expression) + } + + val property = descriptor.correspondingProperty + if (JvmCodegenUtil.isConstOrHasJvmFieldAnnotation(property)) { if (descriptor is PropertyGetterDescriptor) { - return IrGetFieldImpl( - expression.startOffset, - expression.endOffset, - descriptor.correspondingProperty, - expression.dispatchReceiver, - expression.origin, - expression.superQualifier - ) + return substituteGetter(descriptor, expression) } else { - return IrSetFieldImpl( - expression.startOffset, - expression.endOffset, - descriptor.correspondingProperty, - expression.dispatchReceiver, - expression.getValueArgument(descriptor.valueParameters.lastIndex)!!, - expression.origin, - expression.superQualifier - ) + return substituteSetter(descriptor, expression) } } + else if (property is SyntheticJavaPropertyDescriptor) { + expression.dispatchReceiver = expression.extensionReceiver + expression.extensionReceiver = null + } return super.visitCall(expression) } + + private fun substituteSetter(descriptor: PropertyAccessorDescriptor, expression: IrCall): IrSetFieldImpl { + return IrSetFieldImpl( + expression.startOffset, + expression.endOffset, + descriptor.correspondingProperty, + expression.dispatchReceiver, + expression.getValueArgument(descriptor.valueParameters.lastIndex)!!, + expression.origin, + expression.superQualifier + ) + } + + private fun substituteGetter(descriptor: PropertyGetterDescriptor, expression: IrCall): IrGetFieldImpl { + return IrGetFieldImpl( + expression.startOffset, + expression.endOffset, + descriptor.correspondingProperty, + expression.dispatchReceiver, + expression.origin, + expression.superQualifier + ) + } }