[NI] Resolve callable reference eagerly if there is only one candidate
#KT-30737 Fixed
This commit is contained in:
+9
@@ -74,6 +74,15 @@ class CallableReferenceResolver(
|
||||
val candidates = runRHSResolution(scopeTower, argument, expectedType) { checkCallableReference ->
|
||||
csBuilder.runTransaction { checkCallableReference(this); false }
|
||||
}
|
||||
|
||||
if (candidates.size > 1 && resolvedAtom is EagerCallableReferenceAtom) {
|
||||
resolvedAtom.setAnalyzedResults(
|
||||
candidate = null,
|
||||
subResolvedAtoms = listOf(resolvedAtom.transformToPostponed())
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
val chosenCandidate = candidates.singleOrNull()
|
||||
if (chosenCandidate != null) {
|
||||
val (toFreshSubstitutor, diagnostic) = with(chosenCandidate) {
|
||||
|
||||
+1
-4
@@ -19,13 +19,10 @@ package org.jetbrains.kotlin.resolve.calls.components
|
||||
import org.jetbrains.kotlin.builtins.*
|
||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.model.ArgumentConstraintPosition
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintSystemImpl
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.model.LHSArgumentConstraintPosition
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.model.TypeVariableForLambdaReturnType
|
||||
import org.jetbrains.kotlin.resolve.calls.model.*
|
||||
import org.jetbrains.kotlin.types.TypeConstructor
|
||||
import org.jetbrains.kotlin.types.UnwrappedType
|
||||
import org.jetbrains.kotlin.types.typeUtil.builtIns
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
@@ -140,7 +137,7 @@ private fun preprocessCallableReference(
|
||||
expectedType: UnwrappedType?,
|
||||
diagnosticsHolder: KotlinDiagnosticsHolder
|
||||
): ResolvedAtom {
|
||||
val result = ResolvedCallableReferenceAtom(argument, expectedType)
|
||||
val result = EagerCallableReferenceAtom(argument, expectedType)
|
||||
if (expectedType == null) return result
|
||||
|
||||
val notCallableTypeConstructor =
|
||||
|
||||
+1
-3
@@ -5,7 +5,6 @@
|
||||
|
||||
package org.jetbrains.kotlin.resolve.calls.inference.components
|
||||
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.model.NewTypeVariable
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.model.NotEnoughInformationForTypeParameter
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.model.VariableWithConstraints
|
||||
import org.jetbrains.kotlin.resolve.calls.model.*
|
||||
@@ -15,7 +14,6 @@ import org.jetbrains.kotlin.types.model.KotlinTypeMarker
|
||||
import org.jetbrains.kotlin.types.model.TypeConstructorMarker
|
||||
import org.jetbrains.kotlin.types.model.TypeVariableMarker
|
||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.cast
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
|
||||
@@ -79,7 +77,7 @@ class KotlinConstraintSystemCompleter(
|
||||
) ?: break
|
||||
|
||||
if (shouldForceCallableReferenceOrLambdaResolution(completionMode, variableForFixation)) {
|
||||
if (forcePostponedAtomResolution<ResolvedCallableReferenceAtom>(topLevelAtoms, analyze)) continue
|
||||
if (forcePostponedAtomResolution<PostponedCallableReferenceAtom>(topLevelAtoms, analyze)) continue
|
||||
if (forcePostponedAtomResolution<LambdaWithTypeVariableAsExpectedTypeAtom>(topLevelAtoms, analyze)) continue
|
||||
}
|
||||
|
||||
|
||||
+18
-1
@@ -111,7 +111,7 @@ class ResolvedLambdaAtom(
|
||||
override val outputType: UnwrappedType get() = returnType
|
||||
}
|
||||
|
||||
class ResolvedCallableReferenceAtom(
|
||||
abstract class ResolvedCallableReferenceAtom(
|
||||
override val atom: CallableReferenceKotlinCallArgument,
|
||||
val expectedType: UnwrappedType?
|
||||
) : PostponedResolvedAtom() {
|
||||
@@ -126,6 +126,23 @@ class ResolvedCallableReferenceAtom(
|
||||
setAnalyzedResults(subResolvedAtoms)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class EagerCallableReferenceAtom(
|
||||
atom: CallableReferenceKotlinCallArgument,
|
||||
expectedType: UnwrappedType?
|
||||
) : ResolvedCallableReferenceAtom(atom, expectedType) {
|
||||
|
||||
override val inputTypes: Collection<UnwrappedType> get() = emptyList()
|
||||
override val outputType: UnwrappedType? get() = null
|
||||
|
||||
fun transformToPostponed(): PostponedCallableReferenceAtom = PostponedCallableReferenceAtom(this)
|
||||
}
|
||||
|
||||
class PostponedCallableReferenceAtom(
|
||||
eagerCallableReferenceAtom: EagerCallableReferenceAtom
|
||||
) : ResolvedCallableReferenceAtom(eagerCallableReferenceAtom.atom, eagerCallableReferenceAtom.expectedType) {
|
||||
|
||||
override val inputTypes: Collection<UnwrappedType>
|
||||
get() = extractInputOutputTypesFromCallableReferenceExpectedType(expectedType)?.inputTypes ?: listOfNotNull(expectedType)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user