[NI] Keep track of fresh type variables created for particular call candidate

Otherwise we can't obtain inferred type arguments for the call,
which is required for reification.
This commit is contained in:
Dmitry Petrov
2017-04-14 15:33:04 +03:00
committed by Stanislav Erokhin
parent eb7e9196b5
commit 13e8720ddc
5 changed files with 10 additions and 10 deletions
@@ -350,12 +350,7 @@ class NewResolvedCallImpl<D : CallableDescriptor>(
override fun getTypeArguments(): Map<TypeParameterDescriptor, KotlinType> { override fun getTypeArguments(): Map<TypeParameterDescriptor, KotlinType> {
val typeParameters = candidateDescriptor.typeParameters.takeIf { it.isNotEmpty() } ?: return emptyMap() val typeParameters = candidateDescriptor.typeParameters.takeIf { it.isNotEmpty() } ?: return emptyMap()
return typeParameters.zip(completedCall.typeArguments).toMap()
val result = HashMap<TypeParameterDescriptor, UnwrappedType>()
for ((parameter, argument) in typeParameters.zip(completedCall.typeArguments)) {
result[parameter] = argument
}
return result
} }
override fun getSmartCastDispatchReceiverType(): KotlinType? = null // todo override fun getSmartCastDispatchReceiverType(): KotlinType? = null // todo
@@ -121,7 +121,9 @@ class KotlinCallCompleter(
descriptorWithFreshTypes 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) val status = computeStatus(this, resultingDescriptor)
return CompletedKotlinCall.Simple(kotlinCall, candidateDescriptor, resultingDescriptor, status, explicitReceiverKind, return CompletedKotlinCall.Simple(kotlinCall, candidateDescriptor, resultingDescriptor, status, explicitReceiverKind,
@@ -102,7 +102,7 @@ internal object NoArguments : ResolutionPart {
} }
} }
internal object CreteDescriptorWithFreshTypeVariables : ResolutionPart { internal object CreateDescriptorWithFreshTypeVariables : ResolutionPart {
override fun SimpleKotlinResolutionCandidate.process(): List<KotlinCallDiagnostic> { override fun SimpleKotlinResolutionCandidate.process(): List<KotlinCallDiagnostic> {
if (candidateDescriptor.typeParameters.isEmpty()) { if (candidateDescriptor.typeParameters.isEmpty()) {
descriptorWithFreshTypes = candidateDescriptor descriptorWithFreshTypes = candidateDescriptor
@@ -111,6 +111,7 @@ internal object CreteDescriptorWithFreshTypeVariables : ResolutionPart {
val typeParameters = candidateDescriptor.typeParameters val typeParameters = candidateDescriptor.typeParameters
val freshTypeVariables = typeParameters.map { TypeVariableFromCallableDescriptor(kotlinCall, it) } val freshTypeVariables = typeParameters.map { TypeVariableFromCallableDescriptor(kotlinCall, it) }
typeVariablesForFreshTypeParameters = freshTypeVariables
val toFreshVariables = IndexedParametersSubstitution(typeParameters, val toFreshVariables = IndexedParametersSubstitution(typeParameters,
freshTypeVariables.map { it.defaultType.asTypeProjection() }).buildSubstitutor() freshTypeVariables.map { it.defaultType.asTypeProjection() }).buildSubstitutor()
@@ -76,7 +76,7 @@ enum class KotlinCallKind(vararg resolutionPart: ResolutionPart) {
CheckOperatorResolutionPart, CheckOperatorResolutionPart,
NoTypeArguments, NoTypeArguments,
NoArguments, NoArguments,
CreteDescriptorWithFreshTypeVariables, CreateDescriptorWithFreshTypeVariables,
CheckExplicitReceiverKindConsistency, CheckExplicitReceiverKindConsistency,
CheckReceivers CheckReceivers
), ),
@@ -85,7 +85,7 @@ enum class KotlinCallKind(vararg resolutionPart: ResolutionPart) {
CheckVisibility, CheckVisibility,
MapTypeArguments, MapTypeArguments,
MapArguments, MapArguments,
CreteDescriptorWithFreshTypeVariables, CreateDescriptorWithFreshTypeVariables,
CheckExplicitReceiverKindConsistency, CheckExplicitReceiverKindConsistency,
CheckReceivers, CheckReceivers,
CheckArguments CheckArguments
@@ -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.ConstraintSystemBuilder
import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem 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.NewConstraintSystemImpl
import org.jetbrains.kotlin.resolve.calls.inference.model.NewTypeVariable
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
import org.jetbrains.kotlin.resolve.calls.tower.Candidate import org.jetbrains.kotlin.resolve.calls.tower.Candidate
import org.jetbrains.kotlin.resolve.calls.tower.ResolutionCandidateStatus import org.jetbrains.kotlin.resolve.calls.tower.ResolutionCandidateStatus
@@ -115,6 +116,7 @@ open class SimpleKotlinResolutionCandidate(
lateinit var typeArgumentMappingByOriginal: TypeArgumentsToParametersMapper.TypeArgumentsMapping lateinit var typeArgumentMappingByOriginal: TypeArgumentsToParametersMapper.TypeArgumentsMapping
lateinit var argumentMappingByOriginal: Map<ValueParameterDescriptor, ResolvedCallArgument> lateinit var argumentMappingByOriginal: Map<ValueParameterDescriptor, ResolvedCallArgument>
lateinit var descriptorWithFreshTypes: CallableDescriptor lateinit var descriptorWithFreshTypes: CallableDescriptor
lateinit var typeVariablesForFreshTypeParameters: List<NewTypeVariable>
override val lastCall: SimpleKotlinResolutionCandidate get() = this override val lastCall: SimpleKotlinResolutionCandidate get() = this
override val resolutionSequence: List<ResolutionPart> get() = kotlinCall.callKind.resolutionSequence override val resolutionSequence: List<ResolutionPart> get() = kotlinCall.callKind.resolutionSequence