[NI] Fix some argument mapping problems
1. Value arguments for the resolved call are indexed with resulting descriptor value parameters (which can be substituted). 2. Simple argument can be a single vararg element if the corresponding value parameter is a vararg parameter. 3. Resulting descriptor should be approximated to super-type. This doesn't affect type inference, but the JVM BE expects types with proper classifiers.
This commit is contained in:
committed by
Stanislav Erokhin
parent
0c79949cf1
commit
eb7e9196b5
+22
-15
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.resolve.calls.callResolverUtil.getEffectiveExpectedT
|
||||
import org.jetbrains.kotlin.resolve.calls.callUtil.isFakeElement
|
||||
import org.jetbrains.kotlin.resolve.calls.checkers.CallChecker
|
||||
import org.jetbrains.kotlin.resolve.calls.checkers.CallCheckerContext
|
||||
import org.jetbrains.kotlin.resolve.calls.components.isVararg
|
||||
import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext
|
||||
import org.jetbrains.kotlin.resolve.calls.context.CallPosition
|
||||
import org.jetbrains.kotlin.resolve.calls.model.*
|
||||
@@ -244,7 +245,7 @@ sealed class NewAbstractResolvedCall<D : CallableDescriptor>(): ResolvedCall<D>
|
||||
abstract val kotlinCall: KotlinCall
|
||||
|
||||
private var argumentToParameterMap: Map<ValueArgument, ArgumentMatchImpl>? = null
|
||||
private val _valueArguments: Map<ValueParameterDescriptor, ResolvedValueArgument> by lazy(this::createValueArguments)
|
||||
private val _valueArguments: Map<ValueParameterDescriptor, ResolvedValueArgument> by lazy { createValueArguments() }
|
||||
|
||||
override fun getCall(): Call = kotlinCall.psiKotlinCall.psiCall
|
||||
|
||||
@@ -298,7 +299,7 @@ sealed class NewAbstractResolvedCall<D : CallableDescriptor>(): ResolvedCall<D>
|
||||
resultingDescriptor: CallableDescriptor,
|
||||
valueArguments: Map<ValueParameterDescriptor, ResolvedValueArgument>
|
||||
): Map<ValueArgument, ArgumentMatchImpl> =
|
||||
HashMap<ValueArgument, ArgumentMatchImpl>().also { result ->
|
||||
LinkedHashMap<ValueArgument, ArgumentMatchImpl>().also { result ->
|
||||
for (parameter in resultingDescriptor.valueParameters) {
|
||||
val resolvedArgument = valueArguments[parameter] ?: continue
|
||||
for (arguments in resolvedArgument.arguments) {
|
||||
@@ -307,22 +308,28 @@ sealed class NewAbstractResolvedCall<D : CallableDescriptor>(): ResolvedCall<D>
|
||||
}
|
||||
}
|
||||
|
||||
private fun createValueArguments(): Map<ValueParameterDescriptor, ResolvedValueArgument> {
|
||||
val result = HashMap<ValueParameterDescriptor, ResolvedValueArgument>()
|
||||
for (parameter in candidateDescriptor.valueParameters) {
|
||||
val resolvedCallArgument = argumentMappingByOriginal[parameter.original] ?: continue
|
||||
val valueArgument = when (resolvedCallArgument) {
|
||||
ResolvedCallArgument.DefaultArgument -> DefaultValueArgument.DEFAULT
|
||||
is ResolvedCallArgument.SimpleArgument -> ExpressionValueArgument(resolvedCallArgument.callArgument.psiCallArgument.valueArgument)
|
||||
is ResolvedCallArgument.VarargArgument -> VarargValueArgument().apply {
|
||||
resolvedCallArgument.arguments.map { it.psiCallArgument.valueArgument }.forEach(this::addArgument)
|
||||
private fun createValueArguments(): Map<ValueParameterDescriptor, ResolvedValueArgument> =
|
||||
LinkedHashMap<ValueParameterDescriptor, ResolvedValueArgument>().also { result ->
|
||||
for ((originalParameter, resolvedCallArgument) in argumentMappingByOriginal) {
|
||||
val resultingParameter = resultingDescriptor.valueParameters[originalParameter.index]
|
||||
result[resultingParameter] = when (resolvedCallArgument) {
|
||||
ResolvedCallArgument.DefaultArgument ->
|
||||
DefaultValueArgument.DEFAULT
|
||||
is ResolvedCallArgument.SimpleArgument -> {
|
||||
val valueArgument = resolvedCallArgument.callArgument.psiCallArgument.valueArgument
|
||||
if (resultingParameter.isVararg)
|
||||
VarargValueArgument().apply { addArgument(valueArgument) }
|
||||
else
|
||||
ExpressionValueArgument(valueArgument)
|
||||
}
|
||||
is ResolvedCallArgument.VarargArgument ->
|
||||
VarargValueArgument().apply {
|
||||
resolvedCallArgument.arguments.map { it.psiCallArgument.valueArgument }.forEach { addArgument(it) }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
result[parameter] = valueArgument
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
class NewResolvedCallImpl<D : CallableDescriptor>(
|
||||
|
||||
Reference in New Issue
Block a user