diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/substitution/Substitutors.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/substitution/Substitutors.kt index 2d498d16188..5fd020112d2 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/substitution/Substitutors.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/substitution/Substitutors.kt @@ -13,9 +13,10 @@ import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.types.TypeApproximatorConfiguration 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.typeConstructor -abstract class AbstractConeSubstitutor(private val typeContext: ConeTypeContext) : ConeSubstitutor() { +abstract class AbstractConeSubstitutor(protected val typeContext: ConeTypeContext) : ConeSubstitutor() { private fun wrapProjection(old: ConeTypeProjection, newType: ConeKotlinType): ConeTypeProjection { return when (old) { is ConeStarProjection -> old @@ -204,3 +205,27 @@ fun createTypeSubstitutorByTypeConstructor(map: Map, + context: ConeTypeContext +) : AbstractConeSubstitutor(context), TypeSubstitutorMarker { + override fun substituteType(type: ConeKotlinType): ConeKotlinType? { + if (type !is ConeLookupTagBasedType && type !is ConeStubType) return null + val new = map[type.typeConstructor(typeContext)] ?: return null + return new.approximateIntegerLiteralType().updateNullabilityIfNeeded(type)?.withCombinedAttributesFrom(type, typeContext) + } +} + +// Note: builder inference uses TypeSubstitutorByTypeConstructor for not fixed type substitution +class NotFixedTypeToVariableSubstitutorForDelegateInference( + private val bindings: Map, + typeContext: ConeTypeContext +) : AbstractConeSubstitutor(typeContext) { + override fun substituteType(type: ConeKotlinType): ConeKotlinType? { + if (type !is ConeStubType) return null + if (type.constructor.isTypeVariableInSubtyping) return null + return bindings[type.constructor.variable].updateNullabilityIfNeeded(type) + } +} + 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 68c8136f96e..bc830a1f31e 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 @@ -165,14 +165,14 @@ class FirBuilderInferenceSession( } private fun createNonFixedTypeToVariableSubstitutor(): ConeSubstitutor { - val ctx = components.session.typeContext + val typeContext = components.session.typeContext val bindings = mutableMapOf() for ((variable, nonFixedType) in stubsForPostponedVariables) { bindings[nonFixedType.constructor] = variable.defaultType } - return ctx.typeSubstitutorByTypeConstructor(bindings) + return typeContext.typeSubstitutorByTypeConstructor(bindings) } private fun integrateConstraints( 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 22b9b1bddde..7d684ff5f87 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 @@ -10,9 +10,9 @@ import org.jetbrains.kotlin.fir.expressions.FirResolvable import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.resolve.calls.* import org.jetbrains.kotlin.fir.resolve.inference.model.ConeFixVariableConstraintPosition -import org.jetbrains.kotlin.fir.resolve.substitution.AbstractConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ChainedSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor +import org.jetbrains.kotlin.fir.resolve.substitution.NotFixedTypeToVariableSubstitutorForDelegateInference import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem import org.jetbrains.kotlin.resolve.calls.inference.buildAbstractResultingSubstitutor @@ -110,7 +110,7 @@ class FirDelegatedPropertyInferenceSession( completionMode: ConstraintSystemCompletionMode ): Map? = null - private fun createNonFixedTypeToVariableSubstitutor(): ConeSubstitutor { + private fun createNonFixedTypeToVariableSubstitutor(): NotFixedTypeToVariableSubstitutorForDelegateInference { val typeContext = components.session.typeContext val bindings = mutableMapOf() @@ -118,13 +118,7 @@ class FirDelegatedPropertyInferenceSession( bindings[synthetic] = variable.defaultType(typeContext) as ConeKotlinType } - return object : AbstractConeSubstitutor(typeContext) { - override fun substituteType(type: ConeKotlinType): ConeKotlinType? { - if (type !is ConeStubType) return null - if (type.constructor.isTypeVariableInSubtyping) return null - return bindings[type.constructor.variable].updateNullabilityIfNeeded(type) - } - } + return NotFixedTypeToVariableSubstitutorForDelegateInference(bindings, typeContext) }