diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer.kt index d1b9ed0b0eb..7d8fa76c7fe 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer.kt @@ -350,12 +350,7 @@ class NewResolvedCallImpl( override fun getTypeArguments(): Map { val typeParameters = candidateDescriptor.typeParameters.takeIf { it.isNotEmpty() } ?: return emptyMap() - - val result = HashMap() - for ((parameter, argument) in typeParameters.zip(completedCall.typeArguments)) { - result[parameter] = argument - } - return result + return typeParameters.zip(completedCall.typeArguments).toMap() } override fun getSmartCastDispatchReceiverType(): KotlinType? = null // todo diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/KotlinCallCompleter.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/KotlinCallCompleter.kt index 2b5dbfb67c5..eaaf7aa93e8 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/KotlinCallCompleter.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/KotlinCallCompleter.kt @@ -121,7 +121,9 @@ class KotlinCallCompleter( descriptorWithFreshTypes } - val typeArguments = descriptorWithFreshTypes.typeParameters.map { substitutor.safeSubstitute(it.defaultType) } + val typeArguments = descriptorWithFreshTypes.typeParameters.map { + substitutor.safeSubstitute(typeVariablesForFreshTypeParameters[it.index].defaultType) + } val status = computeStatus(this, resultingDescriptor) return CompletedKotlinCall.Simple(kotlinCall, candidateDescriptor, resultingDescriptor, status, explicitReceiverKind, diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt index 48788edc830..8b1f99143cb 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt @@ -102,7 +102,7 @@ internal object NoArguments : ResolutionPart { } } -internal object CreteDescriptorWithFreshTypeVariables : ResolutionPart { +internal object CreateDescriptorWithFreshTypeVariables : ResolutionPart { override fun SimpleKotlinResolutionCandidate.process(): List { if (candidateDescriptor.typeParameters.isEmpty()) { descriptorWithFreshTypes = candidateDescriptor @@ -111,6 +111,7 @@ internal object CreteDescriptorWithFreshTypeVariables : ResolutionPart { val typeParameters = candidateDescriptor.typeParameters val freshTypeVariables = typeParameters.map { TypeVariableFromCallableDescriptor(kotlinCall, it) } + typeVariablesForFreshTypeParameters = freshTypeVariables val toFreshVariables = IndexedParametersSubstitution(typeParameters, freshTypeVariables.map { it.defaultType.asTypeProjection() }).buildSubstitutor() diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinResolverContext.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinResolverContext.kt index 2bf6533b845..66b06b594f7 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinResolverContext.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinResolverContext.kt @@ -76,7 +76,7 @@ enum class KotlinCallKind(vararg resolutionPart: ResolutionPart) { CheckOperatorResolutionPart, NoTypeArguments, NoArguments, - CreteDescriptorWithFreshTypeVariables, + CreateDescriptorWithFreshTypeVariables, CheckExplicitReceiverKindConsistency, CheckReceivers ), @@ -85,7 +85,7 @@ enum class KotlinCallKind(vararg resolutionPart: ResolutionPart) { CheckVisibility, MapTypeArguments, MapArguments, - CreteDescriptorWithFreshTypeVariables, + CreateDescriptorWithFreshTypeVariables, CheckExplicitReceiverKindConsistency, CheckReceivers, CheckArguments diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/ResolutionCandidate.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/ResolutionCandidate.kt index 001f6eab950..ce96b9f0755 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/ResolutionCandidate.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/ResolutionCandidate.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.resolve.calls.components.TypeArgumentsToParametersMa import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintSystemImpl +import org.jetbrains.kotlin.resolve.calls.inference.model.NewTypeVariable import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind import org.jetbrains.kotlin.resolve.calls.tower.Candidate import org.jetbrains.kotlin.resolve.calls.tower.ResolutionCandidateStatus @@ -115,6 +116,7 @@ open class SimpleKotlinResolutionCandidate( lateinit var typeArgumentMappingByOriginal: TypeArgumentsToParametersMapper.TypeArgumentsMapping lateinit var argumentMappingByOriginal: Map lateinit var descriptorWithFreshTypes: CallableDescriptor + lateinit var typeVariablesForFreshTypeParameters: List override val lastCall: SimpleKotlinResolutionCandidate get() = this override val resolutionSequence: List get() = kotlinCall.callKind.resolutionSequence