mirror of
https://github.com/jlengrand/kotlin.git
synced 2026-03-10 08:31:29 +00:00
FIR: take lower priority into account during references EagerResolve
#KT-48158 Fixed
This commit is contained in:
@@ -339,7 +339,7 @@ class FirCallResolver(
|
||||
fun resolveCallableReference(
|
||||
constraintSystemBuilder: ConstraintSystemBuilder,
|
||||
resolvedCallableReferenceAtom: ResolvedCallableReferenceAtom,
|
||||
): Boolean {
|
||||
): Pair<CandidateApplicability, Boolean> {
|
||||
val callableReferenceAccess = resolvedCallableReferenceAtom.reference
|
||||
val lhs = resolvedCallableReferenceAtom.lhs
|
||||
val coneSubstitutor = constraintSystemBuilder.buildCurrentSubstitutor() as ConeSubstitutor
|
||||
@@ -383,7 +383,7 @@ class FirCallResolver(
|
||||
callableReferenceAccess.source
|
||||
)
|
||||
resolvedCallableReferenceAtom.resultingReference = errorReference
|
||||
return false
|
||||
return applicability to false
|
||||
}
|
||||
reducedCandidates.size > 1 -> {
|
||||
if (resolvedCallableReferenceAtom.hasBeenPostponed) {
|
||||
@@ -393,10 +393,10 @@ class FirCallResolver(
|
||||
callableReferenceAccess.source
|
||||
)
|
||||
resolvedCallableReferenceAtom.resultingReference = errorReference
|
||||
return false
|
||||
return applicability to false
|
||||
}
|
||||
resolvedCallableReferenceAtom.hasBeenPostponed = true
|
||||
return true
|
||||
return applicability to true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -417,7 +417,7 @@ class FirCallResolver(
|
||||
resolvedCallableReferenceAtom.resultingReference = reference
|
||||
resolvedCallableReferenceAtom.resultingTypeForCallableReference = chosenCandidate.resultingTypeForCallableReference
|
||||
|
||||
return true
|
||||
return applicability to true
|
||||
}
|
||||
|
||||
fun resolveDelegatingConstructorCall(
|
||||
|
||||
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind.*
|
||||
import org.jetbrains.kotlin.resolve.calls.tower.CandidateApplicability
|
||||
import org.jetbrains.kotlin.types.AbstractNullabilityChecker
|
||||
|
||||
abstract class ResolutionStage {
|
||||
@@ -179,8 +180,15 @@ internal object EagerResolveOfCallableReferences : CheckerStage() {
|
||||
if (candidate.postponedAtoms.isEmpty()) return
|
||||
for (atom in candidate.postponedAtoms) {
|
||||
if (atom is ResolvedCallableReferenceAtom) {
|
||||
if (!context.bodyResolveComponents.callResolver.resolveCallableReference(candidate.csBuilder, atom)) {
|
||||
val (applicability, success) =
|
||||
context.bodyResolveComponents.callResolver.resolveCallableReference(candidate.csBuilder, atom)
|
||||
if (!success) {
|
||||
sink.yieldDiagnostic(InapplicableCandidate)
|
||||
} else when (applicability) {
|
||||
CandidateApplicability.RESOLVED_NEED_PRESERVE_COMPATIBILITY ->
|
||||
candidate.addDiagnostic(LowerPriorityToPreserveCompatibilityDiagnostic)
|
||||
else -> {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,6 @@ public interface Executor {
|
||||
fun f(): String = "test"
|
||||
|
||||
class A {
|
||||
fun schedule1(e: Executor): Future<String> = <!RETURN_TYPE_MISMATCH, TYPE_MISMATCH!>e.submit(::f)<!>
|
||||
fun schedule1(e: Executor): Future<String> = e.submit(::f)
|
||||
fun schedule2(e: Executor): Future<String> = <!RETURN_TYPE_MISMATCH, TYPE_MISMATCH!>e.submit { f() }<!>
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user