Implement proper call to the base class ctor in ir script lowering

This commit is contained in:
Ilya Chernikov
2020-12-14 12:16:56 +01:00
parent 32d0c99289
commit 4dc228a0a3
2 changed files with 23 additions and 7 deletions
@@ -24,7 +24,6 @@ import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.symbols.impl.IrAnonymousInitializerSymbolImpl
import org.jetbrains.kotlin.ir.transformStatement
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
@@ -75,7 +74,7 @@ private class ScriptsToClassesLowering(val context: JvmBackendContext) {
visibility = DescriptorVisibilities.PUBLIC
modality = Modality.FINAL
}.also { irScriptClass ->
irScriptClass.superTypes += context.irBuiltIns.anyType
irScriptClass.superTypes += irScript.baseClass
irScriptClass.parent = irFile
irScriptClass.metadata = irScript.metadata
}
@@ -113,12 +112,29 @@ private class ScriptsToClassesLowering(val context: JvmBackendContext) {
}
}
irScript.explicitCallParameters.forEach { addConstructorParameter(it, true) }
irScript.explicitCallParameters.forEach { addConstructorParameter(it, false) }
irScript.implicitReceiversParameters.forEach { addConstructorParameter(it, false) }
irScript.providedProperties.forEach { addConstructorParameter(it.first, false) }
irConstructor.body = context.createIrBuilder(irConstructor.symbol).irBlockBody {
+irDelegatingConstructorCall(context.irBuiltIns.anyClass.owner.constructors.single())
val baseClassCtor = irScript.baseClass.classOrNull?.owner?.constructors?.firstOrNull()
// TODO: process situation with multiple constructors (should probably be an error)
if (baseClassCtor == null) {
+irDelegatingConstructorCall(context.irBuiltIns.anyClass.owner.constructors.single())
} else {
+irDelegatingConstructorCall(baseClassCtor).also {
irScript.explicitCallParameters.forEachIndexed { idx, valueParameter ->
it.putValueArgument(
idx,
IrGetValueImpl(
valueParameter.startOffset, valueParameter.endOffset,
valueParameter.type,
valueParameter.symbol
)
)
}
}
}
+IrInstanceInitializerCallImpl(
irScript.startOffset, irScript.endOffset,
irScriptClass.symbol,
@@ -288,7 +288,7 @@ class LazyScriptDescriptor(
internal class ConstructorWithParams(
val constructor: ClassConstructorDescriptorImpl,
val explicitConstructorParameters: List<ValueParameterDescriptor>,
val baseClassConstructorParameters: List<ValueParameterDescriptor>,
val implicitReceiversParameters: List<ValueParameterDescriptor>,
val scriptProvidedPropertiesParameters: List<ValueParameterDescriptor>
)
@@ -337,14 +337,14 @@ class LazyScriptDescriptor(
ConstructorWithParams(
constructorDescriptor,
explicitConstructorParameters = explicitParameters,
baseClassConstructorParameters = explicitParameters,
implicitReceiversParameters = implicitReceiversParameters,
scriptProvidedPropertiesParameters = providedPropertiesParameters
)
}
override fun getExplicitConstructorParameters(): List<ValueParameterDescriptor> =
scriptPrimaryConstructorWithParams().explicitConstructorParameters
scriptPrimaryConstructorWithParams().baseClassConstructorParameters
override fun getImplicitReceiversParameters(): List<ValueParameterDescriptor> =
scriptPrimaryConstructorWithParams().implicitReceiversParameters