From 4dc228a0a3edc18ae8d2c372762137cd236f12f1 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Mon, 14 Dec 2020 12:16:56 +0100 Subject: [PATCH] Implement proper call to the base class ctor in ir script lowering --- .../backend/jvm/lower/ScriptLowering.kt | 24 +++++++++++++++---- .../scripting/resolve/LazyScriptDescriptor.kt | 6 ++--- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ScriptLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ScriptLowering.kt index 3c03db79421..4fe57858f52 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ScriptLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ScriptLowering.kt @@ -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, diff --git a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/LazyScriptDescriptor.kt b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/LazyScriptDescriptor.kt index aa1382c750c..530b6d95ecf 100644 --- a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/LazyScriptDescriptor.kt +++ b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/LazyScriptDescriptor.kt @@ -288,7 +288,7 @@ class LazyScriptDescriptor( internal class ConstructorWithParams( val constructor: ClassConstructorDescriptorImpl, - val explicitConstructorParameters: List, + val baseClassConstructorParameters: List, val implicitReceiversParameters: List, val scriptProvidedPropertiesParameters: List ) @@ -337,14 +337,14 @@ class LazyScriptDescriptor( ConstructorWithParams( constructorDescriptor, - explicitConstructorParameters = explicitParameters, + baseClassConstructorParameters = explicitParameters, implicitReceiversParameters = implicitReceiversParameters, scriptProvidedPropertiesParameters = providedPropertiesParameters ) } override fun getExplicitConstructorParameters(): List = - scriptPrimaryConstructorWithParams().explicitConstructorParameters + scriptPrimaryConstructorWithParams().baseClassConstructorParameters override fun getImplicitReceiversParameters(): List = scriptPrimaryConstructorWithParams().implicitReceiversParameters