[NI] Check for maximally specific candidate chosen with factory resolution

This commit is contained in:
Dmitriy Novozhilov
2020-04-27 10:48:17 +03:00
parent e7869bd9d4
commit e1418a5540
12 changed files with 206 additions and 5 deletions
@@ -144,11 +144,17 @@ class KotlinCallResolver(
candidates.all { resolutionCallbacks.inferenceSession.shouldRunCompletion(it) }
) {
val candidatesWithAnnotation =
candidates.filter { it.resolvedCall.candidateDescriptor.annotations.hasAnnotation(OVERLOAD_RESOLUTION_BY_LAMBDA_ANNOTATION) }
candidates.filterTo(mutableSetOf()) { it.resolvedCall.candidateDescriptor.annotations.hasAnnotation(OVERLOAD_RESOLUTION_BY_LAMBDA_ANNOTATION) }
if (candidatesWithAnnotation.isNotEmpty()) {
maximallySpecificCandidates = kotlinCallCompleter.chooseCandidateRegardingFactoryPatternResolution(maximallySpecificCandidates, resolutionCallbacks)
val newCandidates = kotlinCallCompleter.chooseCandidateRegardingFactoryPatternResolution(maximallySpecificCandidates, resolutionCallbacks)
maximallySpecificCandidates = overloadingConflictResolver.chooseMaximallySpecificCandidates(
newCandidates,
CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS,
discriminateGenerics = true
)
if (maximallySpecificCandidates.size > 1) {
maximallySpecificCandidates = candidatesWithAnnotation.toSet() // or revert to original list?
maximallySpecificCandidates = candidatesWithAnnotation
}
}
}
@@ -118,9 +118,11 @@ class KotlinCallCompleter(
diagnosticHolderForLambda,
shouldRunInIndependentContext = true
)
lambdas.getValue(firstCandidate).setAnalyzedResults(results.returnArgumentsInfo, listOf(firstAtom))
val lambdaReturnType = results.lambdaReturnType ?: return candidates
lambdas.getValue(firstCandidate).setAnalyzedResults(results.returnArgumentsInfo, listOf(firstAtom))
firstCandidate.csBuilder.addSubtypeConstraint(lambdaReturnType, firstAtom.returnType, LambdaArgumentConstraintPosition(firstAtom))
while (iterator.hasNext()) {
val (candidate, atom) = iterator.next()
atom.setAnalyzedResults(results.returnArgumentsInfo, firstAtom.subResolvedAtoms!!)