Make parameter descriptor in CallGenerator.genValueAndPut optional

The main implementation in DefaultCallGenerator did not use anything
from that parameter anyway in 99% cases, except the type, which is
passed separately now as JvmKotlinType. This will be useful to implement
call generation for functions which do not have descriptors for their
value parameters (such as signature-polymorphic)

 #KT-14416 In Progress
This commit is contained in:
Alexander Udalov
2018-11-12 18:25:58 +01:00
parent 7766f0a89d
commit 0331f84ccd
4 changed files with 29 additions and 27 deletions
@@ -31,10 +31,12 @@ class CallBasedArgumentGenerator(
}
override fun generateExpression(i: Int, argument: ExpressionValueArgument) {
val parameter = valueParameters[i]
val valueArgument = argument.valueArgument!!
val argumentExpression = valueArgument.getArgumentExpression() ?: error(valueArgument.asElement().text)
callGenerator.genValueAndPut(parameter, argumentExpression, if (isVarargInvoke) OBJECT_TYPE else valueParameterTypes[i], i)
callGenerator.genValueAndPut(
valueParameters[i],
argument.valueArgument!!.getArgumentExpression()!!,
if (isVarargInvoke) JvmKotlinType(OBJECT_TYPE) else getJvmKotlinType(i),
i
)
}
override fun generateDefault(i: Int, argument: DefaultValueArgument) {
@@ -64,5 +66,8 @@ class CallBasedArgumentGenerator(
}
private fun getJvmKotlinType(i: Int): JvmKotlinType =
JvmKotlinType(valueParameterTypes[i], valueParameters[i].original.type)
JvmKotlinType(valueParameterTypes[i], valueParameters[i].unsubstitutedType)
private val ValueParameterDescriptor.unsubstitutedType
get() = containingDeclaration.original.valueParameters[index].type
}
@@ -47,18 +47,18 @@ interface CallGenerator {
}
override fun genValueAndPut(
valueParameterDescriptor: ValueParameterDescriptor,
valueParameterDescriptor: ValueParameterDescriptor?,
argumentExpression: KtExpression,
parameterType: Type,
parameterType: JvmKotlinType,
parameterIndex: Int
) {
val container = valueParameterDescriptor.containingDeclaration
val isVarargInvoke = JvmCodegenUtil.isDeclarationOfBigArityFunctionInvoke(container)
val container = valueParameterDescriptor?.containingDeclaration
val isVarargInvoke = container != null && JvmCodegenUtil.isDeclarationOfBigArityFunctionInvoke(container)
val v = codegen.v
if (isVarargInvoke) {
if (parameterIndex == 0) {
v.iconst(container.valueParameters.size)
v.iconst(container!!.valueParameters.size)
v.newarray(OBJECT_TYPE)
}
v.dup()
@@ -66,16 +66,13 @@ interface CallGenerator {
}
val value = codegen.gen(argumentExpression)
value.put(parameterType, valueParameterDescriptor.unsubstitutedType, v)
value.put(parameterType.type, parameterType.kotlinType, v)
if (isVarargInvoke) {
v.astore(OBJECT_TYPE)
}
}
private val ValueParameterDescriptor.unsubstitutedType
get() = containingDeclaration.original.valueParameters[index].type
override fun putCapturedValueOnStack(stackValue: StackValue, valueType: Type, paramIndex: Int) {
stackValue.put(stackValue.type, stackValue.kotlinType, codegen.v)
}
@@ -119,9 +116,9 @@ interface CallGenerator {
fun genCallInner(callableMethod: Callable, resolvedCall: ResolvedCall<*>?, callDefault: Boolean, codegen: ExpressionCodegen)
fun genValueAndPut(
valueParameterDescriptor: ValueParameterDescriptor,
valueParameterDescriptor: ValueParameterDescriptor?,
argumentExpression: KtExpression,
parameterType: Type,
parameterType: JvmKotlinType,
parameterIndex: Int
)
@@ -737,13 +737,18 @@ class PsiInlineCodegen(
}
override fun genValueAndPut(
valueParameterDescriptor: ValueParameterDescriptor,
valueParameterDescriptor: ValueParameterDescriptor?,
argumentExpression: KtExpression,
parameterType: Type,
parameterType: JvmKotlinType,
parameterIndex: Int
) {
requireNotNull(valueParameterDescriptor) {
"Parameter descriptor can only be null in case a @PolymorphicSignature function is called, " +
"which cannot be declared in Kotlin and thus be inline: $codegen"
}
if (isInliningParameter(argumentExpression, valueParameterDescriptor)) {
val lambdaInfo = rememberClosure(argumentExpression, parameterType, valueParameterDescriptor)
val lambdaInfo = rememberClosure(argumentExpression, parameterType.type, valueParameterDescriptor)
val receiverValue = getBoundCallableReferenceReceiver(argumentExpression)
if (receiverValue != null) {
@@ -762,12 +767,7 @@ class PsiInlineCodegen(
}
} else {
val value = codegen.gen(argumentExpression)
putValueIfNeeded(
JvmKotlinType(parameterType, valueParameterDescriptor.original.type),
value,
ValueKind.GENERAL,
valueParameterDescriptor.index
)
putValueIfNeeded(parameterType, value, ValueKind.GENERAL, parameterIndex)
}
}
@@ -81,9 +81,9 @@ class InlineCodegenForDefaultBody(
}
override fun genValueAndPut(
valueParameterDescriptor: ValueParameterDescriptor,
valueParameterDescriptor: ValueParameterDescriptor?,
argumentExpression: KtExpression,
parameterType: Type,
parameterType: JvmKotlinType,
parameterIndex: Int
) {
throw UnsupportedOperationException("Shouldn't be called")