Generate ir-accessors for interface properties
This commit is contained in:
committed by
Dmitry Petrov
parent
011ed60eee
commit
f30027b4de
+2
-2
@@ -55,7 +55,7 @@ class InterfaceDelegationLowering(val state: GenerationState) : IrElementTransfo
|
||||
if (!interfaceFun.isDefinitelyNotDefaultImplsMethod()) {
|
||||
val inheritedFun =
|
||||
if (classDescriptor !== descriptor) {
|
||||
InterfaceLowering.createDefaultImplFunDescriptor(descriptor as DefaultImplsClassDescriptorImpl, interfaceFun, classDescriptor)
|
||||
InterfaceLowering.createDefaultImplFunDescriptor(descriptor as DefaultImplsClassDescriptorImpl, interfaceFun, classDescriptor, state.typeMapper)
|
||||
}
|
||||
else {
|
||||
value
|
||||
@@ -72,7 +72,7 @@ class InterfaceDelegationLowering(val state: GenerationState) : IrElementTransfo
|
||||
|
||||
val interfaceDescriptor = interfaceFun.containingDeclaration as ClassDescriptor
|
||||
val defaultImpls = InterfaceLowering.createDefaultImplsClassDescriptor(interfaceDescriptor)
|
||||
val defaultImplFun = InterfaceLowering.createDefaultImplFunDescriptor(defaultImpls, interfaceFun, interfaceDescriptor)
|
||||
val defaultImplFun = InterfaceLowering.createDefaultImplFunDescriptor(defaultImpls, interfaceFun, interfaceDescriptor, state.typeMapper)
|
||||
val returnType = inheritedFun.returnType!!
|
||||
val irCallImpl = IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, returnType, defaultImplFun, null, JvmLoweredStatementOrigin.DEFAULT_IMPLS_DELEGATION)
|
||||
irBody.statements.add(IrReturnImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, returnType, inheritedFun, irCallImpl))
|
||||
|
||||
+6
-13
@@ -16,29 +16,21 @@
|
||||
|
||||
package org.jetbrains.kotlin.backend.jvm.lower
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.CodegenUtil
|
||||
import org.jetbrains.kotlin.backend.jvm.ClassLoweringPass
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmLoweredStatementOrigin
|
||||
import org.jetbrains.kotlin.codegen.JvmCodegenUtil
|
||||
import org.jetbrains.kotlin.codegen.isDefinitelyNotDefaultImplsMethod
|
||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationsImpl
|
||||
import org.jetbrains.kotlin.descriptors.impl.FunctionDescriptorImpl
|
||||
import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl
|
||||
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
|
||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||
@@ -53,7 +45,6 @@ class InterfaceLowering(val state: GenerationState) : IrElementTransformerVoid()
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
val interfaceDescriptor = irClass.descriptor
|
||||
val defaultImplsDescriptor = createDefaultImplsClassDescriptor(interfaceDescriptor)
|
||||
val defaultImplsIrClass = IrClassImpl(irClass.startOffset, irClass.endOffset, JvmLoweredDeclarationOrigin.DEFAULT_IMPLS, defaultImplsDescriptor)
|
||||
@@ -64,7 +55,7 @@ class InterfaceLowering(val state: GenerationState) : IrElementTransformerVoid()
|
||||
irClass.declarations.filterIsInstance<IrFunction>().mapNotNull {
|
||||
val descriptor = it.descriptor
|
||||
if (descriptor.modality != Modality.ABSTRACT) {
|
||||
val functionDescriptorImpl = createDefaultImplFunDescriptor(defaultImplsDescriptor, descriptor, interfaceDescriptor)
|
||||
val functionDescriptorImpl = createDefaultImplFunDescriptor(defaultImplsDescriptor, descriptor, interfaceDescriptor, state.typeMapper)
|
||||
|
||||
members.add(IrFunctionImpl(it.startOffset, it.endOffset, it.origin, functionDescriptorImpl, it.body))
|
||||
it.body = null
|
||||
@@ -87,11 +78,13 @@ class InterfaceLowering(val state: GenerationState) : IrElementTransformerVoid()
|
||||
fun createDefaultImplFunDescriptor(
|
||||
defaultImplsDescriptor: DefaultImplsClassDescriptorImpl,
|
||||
descriptor: FunctionDescriptor,
|
||||
interfaceDescriptor: ClassDescriptor
|
||||
interfaceDescriptor: ClassDescriptor, typeMapper: KotlinTypeMapper
|
||||
): SimpleFunctionDescriptorImpl {
|
||||
|
||||
val newFunction = SimpleFunctionDescriptorImpl.create(
|
||||
defaultImplsDescriptor, AnnotationsImpl(emptyList()), descriptor.name, descriptor.kind, descriptor.source
|
||||
defaultImplsDescriptor, AnnotationsImpl(emptyList()),
|
||||
Name.identifier(typeMapper.mapAsmMethod(descriptor).name),
|
||||
descriptor.kind, descriptor.source
|
||||
)
|
||||
|
||||
val valueParameters =
|
||||
|
||||
@@ -110,7 +110,6 @@ class PropertyGenerator(val declarationGenerator: DeclarationGenerator) : Genera
|
||||
val getter = property.getter ?: return null
|
||||
|
||||
val ktGetter = ktProperty.getter
|
||||
if (DescriptorUtils.isInterface(property.containingDeclaration) && ktGetter == null) return null
|
||||
|
||||
val irGetter = ktGetter?.let {
|
||||
IrFunctionImpl(it.startOffset, it.endOffset, IrDeclarationOrigin.DEFINED, getter)
|
||||
@@ -128,7 +127,6 @@ class PropertyGenerator(val declarationGenerator: DeclarationGenerator) : Genera
|
||||
val setter = property.setter ?: return null
|
||||
|
||||
val ktSetter = ktProperty.setter
|
||||
if (DescriptorUtils.isInterface(property.containingDeclaration) && ktSetter == null) return null
|
||||
|
||||
val irSetter = ktSetter?.let {
|
||||
IrFunctionImpl(it.startOffset, it.endOffset, IrDeclarationOrigin.DEFINED, setter)
|
||||
|
||||
Reference in New Issue
Block a user