From 30ea1601d5a46f3ec7715b191ab322d0ba3c81bf Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 21 Dec 2021 13:08:39 +0300 Subject: [PATCH] FIR: commonize builder & inference sessions --- .../AbstractManyCandidatesInferenceSession.kt | 49 +++++++++++++++++++ .../inference/FirBuilderInferenceSession.kt | 40 +-------------- .../FirDelegatedPropertyInferenceSession.kt | 21 +------- 3 files changed, 53 insertions(+), 57 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/AbstractManyCandidatesInferenceSession.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/AbstractManyCandidatesInferenceSession.kt index 2a323ba8095..8d18d3bf3b0 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/AbstractManyCandidatesInferenceSession.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/AbstractManyCandidatesInferenceSession.kt @@ -11,9 +11,17 @@ import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents import org.jetbrains.kotlin.fir.resolve.calls.Candidate import org.jetbrains.kotlin.fir.resolve.calls.ResolutionContext import org.jetbrains.kotlin.fir.resolve.calls.candidate +import org.jetbrains.kotlin.fir.resolve.inference.model.ConeBuilderInferenceSubstitutionConstraintPosition +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor +import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintSystemCompletionContext +import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintKind +import org.jetbrains.kotlin.resolve.calls.inference.model.InitialConstraint +import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintSystemImpl import org.jetbrains.kotlin.types.model.StubTypeMarker +import org.jetbrains.kotlin.types.model.TypeSubstitutorMarker import org.jetbrains.kotlin.types.model.TypeVariableMarker +import org.jetbrains.kotlin.types.model.safeSubstitute abstract class AbstractManyCandidatesInferenceSession( protected val resolutionContext: ResolutionContext @@ -48,4 +56,45 @@ abstract class AbstractManyCandidatesInferenceSession( completedCalls.clear() } + protected fun integrateConstraintToSystem( + commonSystem: NewConstraintSystemImpl, + initialConstraint: InitialConstraint, + callSubstitutor: ConeSubstitutor, + nonFixedToVariablesSubstitutor: ConeSubstitutor, + ): Boolean { + val substitutedConstraint = initialConstraint.substitute(callSubstitutor) + val lower = + nonFixedToVariablesSubstitutor.substituteOrSelf(substitutedConstraint.a as ConeKotlinType) // TODO: SUB + val upper = + nonFixedToVariablesSubstitutor.substituteOrSelf(substitutedConstraint.b as ConeKotlinType) // TODO: SUB + + if (commonSystem.isProperType(lower) && (lower == upper || commonSystem.isProperType(upper))) return false + + when (initialConstraint.constraintKind) { + ConstraintKind.LOWER -> error("LOWER constraint shouldn't be used, please use UPPER") + + ConstraintKind.UPPER -> commonSystem.addSubtypeConstraint(lower, upper, substitutedConstraint.position) + + ConstraintKind.EQUALITY -> + with(commonSystem) { + addSubtypeConstraint(lower, upper, substitutedConstraint.position) + addSubtypeConstraint(upper, lower, substitutedConstraint.position) + } + } + return true + } + + protected fun InitialConstraint.substitute(substitutor: TypeSubstitutorMarker): InitialConstraint { + val lowerSubstituted = substitutor.safeSubstitute(resolutionContext.typeContext, this.a) + val upperSubstituted = substitutor.safeSubstitute(resolutionContext.typeContext, this.b) + + if (lowerSubstituted == a && upperSubstituted == b) return this + + return InitialConstraint( + lowerSubstituted, + upperSubstituted, + this.constraintKind, + ConeBuilderInferenceSubstitutionConstraintPosition(this) // TODO + ) + } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirBuilderInferenceSession.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirBuilderInferenceSession.kt index b7af1fa5db5..68c8136f96e 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirBuilderInferenceSession.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirBuilderInferenceSession.kt @@ -14,7 +14,6 @@ import org.jetbrains.kotlin.fir.expressions.FirResolvable import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.resolve.calls.Candidate import org.jetbrains.kotlin.fir.resolve.calls.ResolutionContext -import org.jetbrains.kotlin.fir.resolve.inference.model.ConeBuilderInferenceSubstitutionConstraintPosition import org.jetbrains.kotlin.fir.resolve.substitution.ChainedSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.types.* @@ -27,9 +26,7 @@ import org.jetbrains.kotlin.resolve.calls.inference.model.* import org.jetbrains.kotlin.resolve.calls.inference.registerTypeVariableIfNotPresent import org.jetbrains.kotlin.resolve.descriptorUtil.BUILDER_INFERENCE_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.types.model.TypeConstructorMarker -import org.jetbrains.kotlin.types.model.TypeSubstitutorMarker import org.jetbrains.kotlin.types.model.TypeVariableMarker -import org.jetbrains.kotlin.types.model.safeSubstitute class FirBuilderInferenceSession( private val lambda: FirAnonymousFunction, @@ -200,27 +197,8 @@ class FirBuilderInferenceSession( for (initialConstraint in storage.initialConstraints) { if (initialConstraint.position is BuilderInferencePosition) continue - val substitutedConstraint = initialConstraint.substitute(callSubstitutor) - - val lower = - nonFixedToVariablesSubstitutor.substituteOrSelf(substitutedConstraint.a as ConeKotlinType) // TODO: SUB - val upper = - nonFixedToVariablesSubstitutor.substituteOrSelf(substitutedConstraint.b as ConeKotlinType) // TODO: SUB - - if (commonSystem.isProperType(lower) && commonSystem.isProperType(upper)) continue - - introducedConstraint = true - - when (initialConstraint.constraintKind) { - ConstraintKind.LOWER -> error("LOWER constraint shouldn't be used, please use UPPER") - - ConstraintKind.UPPER -> commonSystem.addSubtypeConstraint(lower, upper, substitutedConstraint.position) - - ConstraintKind.EQUALITY -> - with(commonSystem) { - addSubtypeConstraint(lower, upper, substitutedConstraint.position) - addSubtypeConstraint(upper, lower, substitutedConstraint.position) - } + if (integrateConstraintToSystem(commonSystem, initialConstraint, callSubstitutor, nonFixedToVariablesSubstitutor)) { + introducedConstraint = true } } @@ -236,20 +214,6 @@ class FirBuilderInferenceSession( return introducedConstraint } - private fun InitialConstraint.substitute(substitutor: TypeSubstitutorMarker): InitialConstraint { - val lowerSubstituted = substitutor.safeSubstitute(resolutionContext.typeContext, this.a) - val upperSubstituted = substitutor.safeSubstitute(resolutionContext.typeContext, this.b) - - if (lowerSubstituted == a && upperSubstituted == b) return this - - return InitialConstraint( - lowerSubstituted, - upperSubstituted, - this.constraintKind, - ConeBuilderInferenceSubstitutionConstraintPosition(this) // TODO - ) - } - private fun updateCalls(commonSystem: NewConstraintSystemImpl) { val nonFixedToVariablesSubstitutor = createNonFixedTypeToVariableSubstitutor() val commonSystemSubstitutor = commonSystem.buildCurrentSubstitutor() as ConeSubstitutor diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirDelegatedPropertyInferenceSession.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirDelegatedPropertyInferenceSession.kt index 2e8857d725a..22b9b1bddde 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirDelegatedPropertyInferenceSession.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/FirDelegatedPropertyInferenceSession.kt @@ -306,25 +306,8 @@ class FirDelegatedPropertyInferenceSession( var introducedConstraint = false for (initialConstraint in storage.initialConstraints) { - val lower = - nonFixedToVariablesSubstitutor.substituteOrSelf(callSubstitutor.substituteOrSelf(initialConstraint.a as ConeKotlinType)) // TODO: SUB - val upper = - nonFixedToVariablesSubstitutor.substituteOrSelf(callSubstitutor.substituteOrSelf(initialConstraint.b as ConeKotlinType)) // TODO: SUB - - if (commonSystem.isProperType(lower) && (lower == upper || commonSystem.isProperType(upper))) continue - - introducedConstraint = true - - when (initialConstraint.constraintKind) { - ConstraintKind.LOWER -> error("LOWER constraint shouldn't be used, please use UPPER") - - ConstraintKind.UPPER -> commonSystem.addSubtypeConstraint(lower, upper, initialConstraint.position) - - ConstraintKind.EQUALITY -> - with(commonSystem) { - addSubtypeConstraint(lower, upper, initialConstraint.position) - addSubtypeConstraint(upper, lower, initialConstraint.position) - } + if (integrateConstraintToSystem(commonSystem, initialConstraint, callSubstitutor, nonFixedToVariablesSubstitutor)) { + introducedConstraint = true } }