Create proper constructor in script descriptor
allows to resolve calls to scripts in compiler (but not in the IDE yet) Some refactorings on the way
This commit is contained in:
@@ -75,9 +75,7 @@ class ScriptCodegen private constructor(
|
||||
|
||||
val jvmSignature = typeMapper.mapScriptSignature(
|
||||
scriptDescriptor,
|
||||
scriptContext.earlierScripts,
|
||||
scriptDefinition.implicitReceivers,
|
||||
scriptDefinition.environmentVariables
|
||||
scriptContext.earlierScripts
|
||||
)
|
||||
|
||||
if (state.replSpecific.shouldGenerateScriptResultValue) {
|
||||
@@ -104,37 +102,6 @@ class ScriptCodegen private constructor(
|
||||
val superclass = scriptDescriptor.getSuperClassNotAny()
|
||||
// TODO: throw if class is not found)
|
||||
|
||||
if (superclass == null) {
|
||||
iv.load(0, classType)
|
||||
iv.invokespecial("java/lang/Object", "<init>", "()V", false)
|
||||
}
|
||||
else {
|
||||
val ctorDesc = superclass.unsubstitutedPrimaryConstructor
|
||||
?: throw RuntimeException("Primary constructor not found for script template " + superclass.toString())
|
||||
|
||||
iv.load(0, classType)
|
||||
|
||||
fun Int.incrementIf(cond: Boolean): Int = if (cond) plus(1) else this
|
||||
val valueParamStart = 1
|
||||
.incrementIf(scriptContext.earlierScripts.isNotEmpty())
|
||||
.incrementIf(scriptDefinition.implicitReceivers.isNotEmpty())
|
||||
.incrementIf(scriptDefinition.environmentVariables.isNotEmpty())
|
||||
|
||||
val valueParameters = scriptDescriptor.unsubstitutedPrimaryConstructor.valueParameters
|
||||
for (superclassParam in ctorDesc.valueParameters) {
|
||||
val valueParam = valueParameters.first { it.name == superclassParam.name }
|
||||
iv.load(valueParam!!.index + valueParamStart, typeMapper.mapType(valueParam.type))
|
||||
}
|
||||
|
||||
val ctorMethod = typeMapper.mapToCallableMethod(ctorDesc, false)
|
||||
val sig = ctorMethod.getAsmMethod().descriptor
|
||||
|
||||
iv.invokespecial(
|
||||
typeMapper.mapSupertype(superclass.defaultType, null).internalName,
|
||||
"<init>", sig, false)
|
||||
}
|
||||
iv.load(0, classType)
|
||||
|
||||
val frameMap = FrameMap()
|
||||
frameMap.enterTemp(OBJECT_TYPE)
|
||||
|
||||
@@ -157,6 +124,37 @@ class ScriptCodegen private constructor(
|
||||
}
|
||||
}
|
||||
|
||||
if (superclass == null) {
|
||||
iv.load(0, classType)
|
||||
iv.invokespecial("java/lang/Object", "<init>", "()V", false)
|
||||
} else {
|
||||
val ctorDesc = superclass.unsubstitutedPrimaryConstructor
|
||||
?: throw RuntimeException("Primary constructor not found for script template " + superclass.toString())
|
||||
|
||||
iv.load(0, classType)
|
||||
|
||||
fun Int.incrementIf(cond: Boolean): Int = if (cond) plus(1) else this
|
||||
val valueParamStart = 1
|
||||
.incrementIf(scriptContext.earlierScripts.isNotEmpty())
|
||||
|
||||
val valueParameters = scriptDescriptor.unsubstitutedPrimaryConstructor.valueParameters
|
||||
for (superclassParam in ctorDesc.valueParameters) {
|
||||
val valueParam = valueParameters.first { it.name == superclassParam.name }
|
||||
val paramType = typeMapper.mapType(valueParam.type)
|
||||
iv.load(valueParam!!.index + valueParamStart, paramType)
|
||||
frameMap.enterTemp(paramType)
|
||||
}
|
||||
|
||||
val ctorMethod = typeMapper.mapToCallableMethod(ctorDesc, false)
|
||||
val sig = ctorMethod.getAsmMethod().descriptor
|
||||
|
||||
iv.invokespecial(
|
||||
typeMapper.mapSupertype(superclass.defaultType, null).internalName,
|
||||
"<init>", sig, false
|
||||
)
|
||||
}
|
||||
iv.load(0, classType)
|
||||
|
||||
if (scriptDefinition.implicitReceivers.isNotEmpty()) {
|
||||
val receiversParamIndex = frameMap.enterTemp(AsmUtil.getArrayType(OBJECT_TYPE))
|
||||
|
||||
|
||||
@@ -1607,9 +1607,7 @@ public class KotlinTypeMapper {
|
||||
@NotNull
|
||||
public JvmMethodSignature mapScriptSignature(
|
||||
@NotNull ScriptDescriptor script,
|
||||
@NotNull List<ScriptDescriptor> importedScripts,
|
||||
List<? extends KType> implicitReceivers,
|
||||
List<? extends Pair<String, ? extends KType>> environmentVariables
|
||||
@NotNull List<ScriptDescriptor> importedScripts
|
||||
) {
|
||||
JvmSignatureWriter sw = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD);
|
||||
|
||||
@@ -1619,14 +1617,6 @@ public class KotlinTypeMapper {
|
||||
writeParameter(sw, DescriptorUtilsKt.getModule(script).getBuiltIns().getArray().getDefaultType(), null);
|
||||
}
|
||||
|
||||
if (implicitReceivers.size() > 0) {
|
||||
writeParameter(sw, DescriptorUtilsKt.getModule(script).getBuiltIns().getArray().getDefaultType(), null);
|
||||
}
|
||||
|
||||
if (environmentVariables.size() > 0) {
|
||||
writeParameter(sw, DescriptorUtilsKt.getModule(script).getBuiltIns().getMap().getDefaultType(), null);
|
||||
}
|
||||
|
||||
for (ValueParameterDescriptor valueParameter : script.getUnsubstitutedPrimaryConstructor().getValueParameters()) {
|
||||
writeParameter(sw, valueParameter.getType(), /* callableDescriptor = */ null);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user