JVM_IR. Mostly remove descriptors from ConstAndJvmFieldPropertiesLowering

This commit is contained in:
Georgy Bronnikov
2018-09-24 15:30:11 +03:00
parent 6e2e6794aa
commit 827494abbe
@@ -18,9 +18,13 @@ import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrConst import org.jetbrains.kotlin.ir.expressions.IrConst
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrGetterCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrSetterCallImpl
import org.jetbrains.kotlin.ir.util.hasAnnotation
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
import org.jetbrains.kotlin.load.java.JvmAbi.JVM_FIELD_ANNOTATION_FQ_NAME
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
class ConstAndJvmFieldPropertiesLowering(val context: JvmBackendContext) : IrElementTransformerVoid(), FileLoweringPass { class ConstAndJvmFieldPropertiesLowering(val context: JvmBackendContext) : IrElementTransformerVoid(), FileLoweringPass {
@@ -45,40 +49,38 @@ class ConstAndJvmFieldPropertiesLowering(val context: JvmBackendContext) : IrEle
(irProperty.backingField?.initializer?.expression as? IrConst<*>)?.let { return it } (irProperty.backingField?.initializer?.expression as? IrConst<*>)?.let { return it }
} }
val descriptor = expression.descriptor as? PropertyAccessorDescriptor ?: return super.visitCall(expression) if (irProperty.backingField?.hasAnnotation(JVM_FIELD_ANNOTATION_FQ_NAME) == true) {
return if (expression is IrGetterCallImpl) {
val property = descriptor.correspondingProperty substituteGetter(irProperty, expression)
if (JvmCodegenUtil.isConstOrHasJvmFieldAnnotation(property)) {
return if (descriptor is PropertyGetterDescriptor) {
substituteGetter(descriptor, expression)
} else { } else {
substituteSetter(descriptor, expression) assert(expression is IrSetterCallImpl)
substituteSetter(irProperty, expression)
} }
} else if (property is SyntheticJavaPropertyDescriptor) { } else if (irProperty.descriptor is SyntheticJavaPropertyDescriptor) {
expression.dispatchReceiver = expression.extensionReceiver expression.dispatchReceiver = expression.extensionReceiver
expression.extensionReceiver = null expression.extensionReceiver = null
} }
return super.visitCall(expression) return super.visitCall(expression)
} }
private fun substituteSetter(descriptor: PropertyAccessorDescriptor, expression: IrCall): IrSetFieldImpl { private fun substituteSetter(irProperty: IrProperty, expression: IrCall): IrSetFieldImpl {
return IrSetFieldImpl( return IrSetFieldImpl(
expression.startOffset, expression.startOffset,
expression.endOffset, expression.endOffset,
context.ir.symbols.externalSymbolTable.referenceField(descriptor.correspondingProperty), irProperty.backingField!!.symbol,
expression.dispatchReceiver, expression.dispatchReceiver,
expression.getValueArgument(descriptor.valueParameters.lastIndex)!!, expression.getValueArgument(expression.symbol.owner.valueParameters.lastIndex)!!,
expression.type, expression.type,
expression.origin, expression.origin,
expression.superQualifier?.let { context.ir.symbols.externalSymbolTable.referenceClass(it) } expression.superQualifier?.let { context.ir.symbols.externalSymbolTable.referenceClass(it) }
) )
} }
private fun substituteGetter(descriptor: PropertyGetterDescriptor, expression: IrCall): IrExpression { private fun substituteGetter(irProperty: IrProperty, expression: IrCall): IrExpression {
return IrGetFieldImpl( return IrGetFieldImpl(
expression.startOffset, expression.startOffset,
expression.endOffset, expression.endOffset,
context.ir.symbols.externalSymbolTable.referenceField(descriptor.correspondingProperty), irProperty.backingField!!.symbol,
expression.type, expression.type,
expression.dispatchReceiver, expression.dispatchReceiver,
expression.origin, expression.origin,