[FE 1.0] Eliminate resolution ambiguity with external type parameters

^KT-10926 Fixed
This commit is contained in:
Victor Petukhov
2021-11-15 11:14:50 +03:00
committed by teamcityserver
parent 31668ed40d
commit a5c6d370dd
20 changed files with 613 additions and 7 deletions
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.resolve.calls.components
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintInjector
import org.jetbrains.kotlin.resolve.calls.model.KotlinCallArgument
@@ -57,10 +58,15 @@ class NewOverloadingConflictResolver(
companion object {
private fun createFlatSignature(candidate: ResolutionCandidate): FlatSignature<ResolutionCandidate> {
val resolvedCall = candidate.resolvedCall
val originalDescriptor = resolvedCall.candidateDescriptor.original
val originalValueParameters = originalDescriptor.valueParameters
val isEliminationAmbiguitiesWithExternalTypeParametersEnabled =
candidate.callComponents.languageVersionSettings.supportsFeature(LanguageFeature.EliminateAmbiguitiesWithExternalTypeParameters)
val descriptor = if (isEliminationAmbiguitiesWithExternalTypeParametersEnabled) {
resolvedCall.candidateDescriptor
} else {
resolvedCall.candidateDescriptor.original
}
val valueParameters = descriptor.valueParameters
var numDefaults = 0
val valueArgumentToParameterType = HashMap<KotlinCallArgument, KotlinType>()
@@ -68,16 +74,17 @@ class NewOverloadingConflictResolver(
if (resolvedValueArgument is ResolvedCallArgument.DefaultArgument) {
numDefaults++
} else {
val originalValueParameter = originalValueParameters[valueParameter.index]
val originalValueParameter = valueParameters[valueParameter.index]
for (valueArgument in resolvedValueArgument.arguments) {
valueArgumentToParameterType[valueArgument] = candidate.resolvedCall.argumentsWithConversion[valueArgument]?.convertedTypeByOriginParameter ?:
valueArgument.getExpectedType(originalValueParameter, candidate.callComponents.languageVersionSettings)
valueArgumentToParameterType[valueArgument] =
candidate.resolvedCall.argumentsWithConversion[valueArgument]?.convertedTypeByOriginParameter
?: valueArgument.getExpectedType(originalValueParameter, candidate.callComponents.languageVersionSettings)
}
}
}
return FlatSignature.create(candidate,
originalDescriptor,
descriptor,
numDefaults,
resolvedCall.atom.argumentsInParenthesis.map { valueArgumentToParameterType[it] } +
listOfNotNull(resolvedCall.atom.externalArgument?.let { valueArgumentToParameterType[it] })