Implement proper call to the base class ctor in ir script lowering
This commit is contained in:
+20
-4
@@ -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,
|
||||
|
||||
+3
-3
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user