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.expressions.impl.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.*
|
import org.jetbrains.kotlin.ir.symbols.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrAnonymousInitializerSymbolImpl
|
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.types.*
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
@@ -75,7 +74,7 @@ private class ScriptsToClassesLowering(val context: JvmBackendContext) {
|
|||||||
visibility = DescriptorVisibilities.PUBLIC
|
visibility = DescriptorVisibilities.PUBLIC
|
||||||
modality = Modality.FINAL
|
modality = Modality.FINAL
|
||||||
}.also { irScriptClass ->
|
}.also { irScriptClass ->
|
||||||
irScriptClass.superTypes += context.irBuiltIns.anyType
|
irScriptClass.superTypes += irScript.baseClass
|
||||||
irScriptClass.parent = irFile
|
irScriptClass.parent = irFile
|
||||||
irScriptClass.metadata = irScript.metadata
|
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.implicitReceiversParameters.forEach { addConstructorParameter(it, false) }
|
||||||
irScript.providedProperties.forEach { addConstructorParameter(it.first, false) }
|
irScript.providedProperties.forEach { addConstructorParameter(it.first, false) }
|
||||||
|
|
||||||
irConstructor.body = context.createIrBuilder(irConstructor.symbol).irBlockBody {
|
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(
|
+IrInstanceInitializerCallImpl(
|
||||||
irScript.startOffset, irScript.endOffset,
|
irScript.startOffset, irScript.endOffset,
|
||||||
irScriptClass.symbol,
|
irScriptClass.symbol,
|
||||||
|
|||||||
+3
-3
@@ -288,7 +288,7 @@ class LazyScriptDescriptor(
|
|||||||
|
|
||||||
internal class ConstructorWithParams(
|
internal class ConstructorWithParams(
|
||||||
val constructor: ClassConstructorDescriptorImpl,
|
val constructor: ClassConstructorDescriptorImpl,
|
||||||
val explicitConstructorParameters: List<ValueParameterDescriptor>,
|
val baseClassConstructorParameters: List<ValueParameterDescriptor>,
|
||||||
val implicitReceiversParameters: List<ValueParameterDescriptor>,
|
val implicitReceiversParameters: List<ValueParameterDescriptor>,
|
||||||
val scriptProvidedPropertiesParameters: List<ValueParameterDescriptor>
|
val scriptProvidedPropertiesParameters: List<ValueParameterDescriptor>
|
||||||
)
|
)
|
||||||
@@ -337,14 +337,14 @@ class LazyScriptDescriptor(
|
|||||||
|
|
||||||
ConstructorWithParams(
|
ConstructorWithParams(
|
||||||
constructorDescriptor,
|
constructorDescriptor,
|
||||||
explicitConstructorParameters = explicitParameters,
|
baseClassConstructorParameters = explicitParameters,
|
||||||
implicitReceiversParameters = implicitReceiversParameters,
|
implicitReceiversParameters = implicitReceiversParameters,
|
||||||
scriptProvidedPropertiesParameters = providedPropertiesParameters
|
scriptProvidedPropertiesParameters = providedPropertiesParameters
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getExplicitConstructorParameters(): List<ValueParameterDescriptor> =
|
override fun getExplicitConstructorParameters(): List<ValueParameterDescriptor> =
|
||||||
scriptPrimaryConstructorWithParams().explicitConstructorParameters
|
scriptPrimaryConstructorWithParams().baseClassConstructorParameters
|
||||||
|
|
||||||
override fun getImplicitReceiversParameters(): List<ValueParameterDescriptor> =
|
override fun getImplicitReceiversParameters(): List<ValueParameterDescriptor> =
|
||||||
scriptPrimaryConstructorWithParams().implicitReceiversParameters
|
scriptPrimaryConstructorWithParams().implicitReceiversParameters
|
||||||
|
|||||||
Reference in New Issue
Block a user