Document&use CandidateApplicability.shouldStopResolve/isSuccess properly

This commit is contained in:
Mikhail Glukhikh
2022-07-26 11:22:46 +02:00
committed by Space
parent 010d5b76e5
commit d0c518013a
4 changed files with 31 additions and 18 deletions
@@ -29,9 +29,13 @@ sealed class ResolutionCandidate : Candidate, KotlinDiagnosticsHolder {
override val isSuccessful: Boolean
get() {
processParts(stopOnFirstError = true)
return resultingApplicabilities.minOrNull()!!.isSuccess && !getSystem().hasContradiction
// Note: candidate with K1_RESOLVED_WITH_ERROR is exceptionally treated as successful
return resultingApplicabilities.minOrNull()!!.isSuccessOrSuccessWithError && !getSystem().hasContradiction
}
private val CandidateApplicability.isSuccessOrSuccessWithError: Boolean
get() = this >= CandidateApplicability.RESOLVED_LOW_PRIORITY
override val resultingApplicability: CandidateApplicability
get() {
processParts(stopOnFirstError = false)
@@ -424,30 +424,30 @@ class TowerResolver {
if (!isSuccessful) return null
var compatibilityCandidate: C? = null
var compatibilityGroup: Collection<C>? = null
var firstGroupWithResolved: Collection<C>? = null
var shouldStopGroup: Collection<C>? = null
outer@ for (group in candidateGroups) {
for (candidate in group) {
if (isSuccessfulCandidate(candidate)) {
firstGroupWithResolved = group
if (shouldStopResolveOnCandidate(candidate)) {
shouldStopGroup = group
break@outer
}
if (compatibilityCandidate == null && isSuccessfulPreserveCompatibility(candidate)) {
if (compatibilityCandidate == null && isPreserveCompatibilityCandidate(candidate)) {
compatibilityGroup = group
compatibilityCandidate = candidate
}
}
}
if (firstGroupWithResolved == null) return null
if (shouldStopGroup == null) return null
if (compatibilityCandidate != null
&& compatibilityGroup !== firstGroupWithResolved
&& compatibilityGroup !== shouldStopGroup
&& needToReportCompatibilityWarning(compatibilityCandidate)
) {
firstGroupWithResolved.forEach { it.addCompatibilityWarning(compatibilityCandidate) }
shouldStopGroup.forEach { it.addCompatibilityWarning(compatibilityCandidate) }
}
return firstGroupWithResolved.filter(::isSuccessfulCandidate)
return shouldStopGroup.filter(::shouldStopResolveOnCandidate)
}
private fun needToReportCompatibilityWarning(candidate: C) = candidate is ResolutionCandidate &&
@@ -455,12 +455,11 @@ class TowerResolver {
(it.constraintSystemError as? LowerPriorityToPreserveCompatibility)?.needToReportWarning == true
}
private fun isSuccessfulCandidate(candidate: C): Boolean {
return candidate.resultingApplicability == CandidateApplicability.RESOLVED
|| candidate.resultingApplicability == CandidateApplicability.K1_RESOLVED_WITH_ERROR
private fun shouldStopResolveOnCandidate(candidate: C): Boolean {
return candidate.resultingApplicability.shouldStopResolve
}
private fun isSuccessfulPreserveCompatibility(candidate: C): Boolean =
private fun isPreserveCompatibilityCandidate(candidate: C): Boolean =
candidate.resultingApplicability == CandidateApplicability.RESOLVED_NEED_PRESERVE_COMPATIBILITY
override fun pushCandidates(candidates: Collection<C>) {