Generate explicit call to 'Any()' if no superclass found.
Generate call super-constructor calls as IrDelegatedConstructorCall.
This commit is contained in:
committed by
Dmitry Petrov
parent
535ddd639f
commit
28b3ea27f3
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.endOffset
|
||||
import org.jetbrains.kotlin.psi.psiUtil.startOffset
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny
|
||||
import java.lang.AssertionError
|
||||
import java.util.*
|
||||
|
||||
@@ -177,16 +178,27 @@ class BodyGenerator(val scopeOwner: DeclarationDescriptor, override val context:
|
||||
irBlockBody.addStatement(generateEnumEntrySuperConstructorCall(ktClassOrObject as KtEnumEntry, classDescriptor))
|
||||
}
|
||||
else -> {
|
||||
val ktSuperTypeList = ktClassOrObject.getSuperTypeList() ?: return
|
||||
for (ktSuperTypeListEntry in ktSuperTypeList.entries) {
|
||||
if (ktSuperTypeListEntry is KtSuperTypeCallEntry) {
|
||||
val statementGenerator = createStatementGenerator()
|
||||
val superConstructorCall = statementGenerator.pregenerateCall(getResolvedCall(ktSuperTypeListEntry)!!)
|
||||
val irSuperConstructorCall = CallGenerator(statementGenerator).generateCall(
|
||||
ktSuperTypeListEntry, superConstructorCall, IrOperator.SUPER_CONSTRUCTOR_CALL)
|
||||
irBlockBody.addStatement(irSuperConstructorCall)
|
||||
val statementGenerator = createStatementGenerator()
|
||||
|
||||
ktClassOrObject.getSuperTypeList()?.let { ktSuperTypeList ->
|
||||
for (ktSuperTypeListEntry in ktSuperTypeList.entries) {
|
||||
if (ktSuperTypeListEntry is KtSuperTypeCallEntry) {
|
||||
val superConstructorCall = statementGenerator.pregenerateCall(getResolvedCall(ktSuperTypeListEntry)!!)
|
||||
val irSuperConstructorCall = CallGenerator(statementGenerator).generateDelegatingConstructorCall(
|
||||
ktSuperTypeListEntry.startOffset, ktSuperTypeListEntry.endOffset, superConstructorCall)
|
||||
irBlockBody.addStatement(irSuperConstructorCall)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If we are here, we didn't find a superclass entry in super types.
|
||||
// Thus, super class should be Any.
|
||||
val superClass = classDescriptor.getSuperClassOrAny()
|
||||
assert(KotlinBuiltIns.isAny(superClass)) { "$classDescriptor: Super class should be any: $superClass" }
|
||||
val superConstructor = superClass.constructors.single()
|
||||
irBlockBody.addStatement(IrDelegatingConstructorCallImpl(ktClassOrObject.startOffset, ktClassOrObject.endOffset,
|
||||
superConstructor))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-2
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.ir.expressions
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
|
||||
|
||||
interface IrDelegatingConstructorCall : IrGeneralCall {
|
||||
override val descriptor: ConstructorDescriptor
|
||||
@@ -28,7 +27,7 @@ class IrDelegatingConstructorCallImpl(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
override val descriptor: ConstructorDescriptor
|
||||
) : IrGeneralCallBase(startOffset, endOffset, descriptor.builtIns.unitType, descriptor.valueParameters.size), IrDelegatingConstructorCall {
|
||||
) : IrGeneralCallBase(startOffset, endOffset, descriptor.returnType, descriptor.valueParameters.size), IrDelegatingConstructorCall {
|
||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
|
||||
return visitor.visitDelegatingConstructorCall(this, data)
|
||||
}
|
||||
|
||||
@@ -89,7 +89,6 @@ interface IrOperator {
|
||||
object ANONYMOUS_FUNCTION : IrOperatorImpl("ANONYMOUS_FUNCTION")
|
||||
object OBJECT_LITERAL : IrOperatorImpl("OBJECT_LITERAL")
|
||||
|
||||
object SUPER_CONSTRUCTOR_CALL : IrOperatorImpl("SUPER_CONSTRUCTOR_CALL")
|
||||
object INITIALIZE_PROPERTY_FROM_PARAMETER : IrOperatorImpl("INITIALIZE_PROPERTY_FROM_PARAMETER")
|
||||
|
||||
object PROPERTY_REFERENCE_FOR_DELEGATE : IrOperatorImpl("PROPERTY_REFERENCE_FOR_DELEGATE")
|
||||
|
||||
Reference in New Issue
Block a user