Introduce hierarchy of inference sessions
This commit is contained in:
+6
-2
@@ -32,7 +32,8 @@ class DelegatedPropertyInferenceSession(
|
|||||||
postponedArgumentsAnalyzer: PostponedArgumentsAnalyzer,
|
postponedArgumentsAnalyzer: PostponedArgumentsAnalyzer,
|
||||||
kotlinConstraintSystemCompleter: KotlinConstraintSystemCompleter,
|
kotlinConstraintSystemCompleter: KotlinConstraintSystemCompleter,
|
||||||
callComponents: KotlinCallComponents,
|
callComponents: KotlinCallComponents,
|
||||||
builtIns: KotlinBuiltIns
|
builtIns: KotlinBuiltIns,
|
||||||
|
override val parentSession: InferenceSession?
|
||||||
) : ManyCandidatesResolver<FunctionDescriptor>(
|
) : ManyCandidatesResolver<FunctionDescriptor>(
|
||||||
psiCallResolver, postponedArgumentsAnalyzer, kotlinConstraintSystemCompleter, callComponents, builtIns
|
psiCallResolver, postponedArgumentsAnalyzer, kotlinConstraintSystemCompleter, callComponents, builtIns
|
||||||
) {
|
) {
|
||||||
@@ -92,7 +93,10 @@ class DelegatedPropertyInferenceSession(
|
|||||||
override fun shouldCompleteResolvedSubAtomsOf(resolvedCallAtom: ResolvedCallAtom) = true
|
override fun shouldCompleteResolvedSubAtomsOf(resolvedCallAtom: ResolvedCallAtom) = true
|
||||||
}
|
}
|
||||||
|
|
||||||
class InferenceSessionForExistingCandidates(private val resolveReceiverIndependently: Boolean) : InferenceSession {
|
class InferenceSessionForExistingCandidates(
|
||||||
|
private val resolveReceiverIndependently: Boolean,
|
||||||
|
override val parentSession: InferenceSession?
|
||||||
|
) : InferenceSession {
|
||||||
override fun shouldRunCompletion(candidate: KotlinResolutionCandidate): Boolean {
|
override fun shouldRunCompletion(candidate: KotlinResolutionCandidate): Boolean {
|
||||||
return !ErrorUtils.isError(candidate.resolvedCall.candidateDescriptor)
|
return !ErrorUtils.isError(candidate.resolvedCall.candidateDescriptor)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -580,7 +580,7 @@ class DelegatedPropertyResolver(
|
|||||||
|
|
||||||
val contextForProvideDelegate = createContextForProvideDelegateMethod(
|
val contextForProvideDelegate = createContextForProvideDelegateMethod(
|
||||||
scopeForDelegate, delegateDataFlow, traceForProvideDelegate,
|
scopeForDelegate, delegateDataFlow, traceForProvideDelegate,
|
||||||
InferenceSessionForExistingCandidates(substitutionMap != null)
|
InferenceSessionForExistingCandidates(substitutionMap != null, inferenceSession)
|
||||||
)
|
)
|
||||||
|
|
||||||
val provideDelegateResults = getProvideDelegateMethod(
|
val provideDelegateResults = getProvideDelegateMethod(
|
||||||
@@ -652,7 +652,7 @@ class DelegatedPropertyResolver(
|
|||||||
val newInferenceSession = DelegatedPropertyInferenceSession(
|
val newInferenceSession = DelegatedPropertyInferenceSession(
|
||||||
variableDescriptor, expectedType, psiCallResolver,
|
variableDescriptor, expectedType, psiCallResolver,
|
||||||
postponedArgumentsAnalyzer, kotlinConstraintSystemCompleter,
|
postponedArgumentsAnalyzer, kotlinConstraintSystemCompleter,
|
||||||
callComponents, builtIns
|
callComponents, builtIns, inferenceSession
|
||||||
)
|
)
|
||||||
|
|
||||||
val receiver = createReceiverForGetSetValueMethods(delegateExpression, delegateType, trace)
|
val receiver = createReceiverForGetSetValueMethods(delegateExpression, delegateType, trace)
|
||||||
|
|||||||
+16
-6
@@ -15,10 +15,7 @@ import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
|||||||
import org.jetbrains.kotlin.psi.psiUtil.isAncestor
|
import org.jetbrains.kotlin.psi.psiUtil.isAncestor
|
||||||
import org.jetbrains.kotlin.resolve.*
|
import org.jetbrains.kotlin.resolve.*
|
||||||
import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver
|
import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver
|
||||||
import org.jetbrains.kotlin.resolve.calls.components.CompletedCallInfo
|
import org.jetbrains.kotlin.resolve.calls.components.*
|
||||||
import org.jetbrains.kotlin.resolve.calls.components.NewConstraintSystemImpl
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzer
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.components.stableType
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext
|
import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode
|
import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionMode
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter
|
import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter
|
||||||
@@ -71,6 +68,8 @@ class BuilderInferenceSession(
|
|||||||
|
|
||||||
private var hasInapplicableCall = false
|
private var hasInapplicableCall = false
|
||||||
|
|
||||||
|
override val parentSession = topLevelCallContext.inferenceSession
|
||||||
|
|
||||||
override fun shouldRunCompletion(candidate: KotlinResolutionCandidate): Boolean {
|
override fun shouldRunCompletion(candidate: KotlinResolutionCandidate): Boolean {
|
||||||
val system = candidate.getSystem() as NewConstraintSystemImpl
|
val system = candidate.getSystem() as NewConstraintSystemImpl
|
||||||
|
|
||||||
@@ -147,7 +146,18 @@ class BuilderInferenceSession(
|
|||||||
descriptor.extensionReceiverParameter?.type?.contains { it is StubType } == true
|
descriptor.extensionReceiverParameter?.type?.contains { it is StubType } == true
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isTopLevelBuilderInferenceCall() = topLevelCallContext.inferenceSession !is BuilderInferenceSession
|
private fun isTopLevelBuilderInferenceCall() = findParentBuildInferenceSession() == null
|
||||||
|
|
||||||
|
private fun findParentBuildInferenceSession(): BuilderInferenceSession? {
|
||||||
|
var currentSession: InferenceSession? = parentSession
|
||||||
|
|
||||||
|
while (currentSession != null) {
|
||||||
|
if (currentSession is BuilderInferenceSession) return currentSession
|
||||||
|
currentSession = currentSession.parentSession
|
||||||
|
}
|
||||||
|
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
fun hasInapplicableCall(): Boolean = hasInapplicableCall
|
fun hasInapplicableCall(): Boolean = hasInapplicableCall
|
||||||
|
|
||||||
@@ -234,7 +244,7 @@ class BuilderInferenceSession(
|
|||||||
bindings[nonFixedType.constructor] = variable.defaultType
|
bindings[nonFixedType.constructor] = variable.defaultType
|
||||||
}
|
}
|
||||||
|
|
||||||
val parentBuilderInferenceCallSession = topLevelCallContext.inferenceSession as? BuilderInferenceSession
|
val parentBuilderInferenceCallSession = findParentBuildInferenceSession()
|
||||||
|
|
||||||
if (parentBuilderInferenceCallSession != null) {
|
if (parentBuilderInferenceCallSession != null) {
|
||||||
bindings.putAll(parentBuilderInferenceCallSession.createNonFixedTypeToVariableMap())
|
bindings.putAll(parentBuilderInferenceCallSession.createNonFixedTypeToVariableMap())
|
||||||
|
|||||||
+4
@@ -12,8 +12,12 @@ import org.jetbrains.kotlin.types.TypeConstructor
|
|||||||
import org.jetbrains.kotlin.types.UnwrappedType
|
import org.jetbrains.kotlin.types.UnwrappedType
|
||||||
|
|
||||||
interface InferenceSession {
|
interface InferenceSession {
|
||||||
|
val parentSession: InferenceSession?
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val default = object : InferenceSession {
|
val default = object : InferenceSession {
|
||||||
|
override val parentSession: InferenceSession? = null
|
||||||
|
|
||||||
override fun shouldRunCompletion(candidate: KotlinResolutionCandidate): Boolean = true
|
override fun shouldRunCompletion(candidate: KotlinResolutionCandidate): Boolean = true
|
||||||
override fun addPartialCallInfo(callInfo: PartialCallInfo) {}
|
override fun addPartialCallInfo(callInfo: PartialCallInfo) {}
|
||||||
override fun addErrorCallInfo(callInfo: ErrorCallInfo) {}
|
override fun addErrorCallInfo(callInfo: ErrorCallInfo) {}
|
||||||
|
|||||||
Reference in New Issue
Block a user