diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContext.kt index 1a54130b6ad..73b4ffdafb1 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContext.kt @@ -25,10 +25,7 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.calls.mpp.ExpectActualMatchingContext import org.jetbrains.kotlin.types.AbstractTypeChecker import org.jetbrains.kotlin.types.Variance -import org.jetbrains.kotlin.types.model.KotlinTypeMarker -import org.jetbrains.kotlin.types.model.SimpleTypeMarker -import org.jetbrains.kotlin.types.model.TypeSubstitutorMarker -import org.jetbrains.kotlin.types.model.TypeSystemInferenceExtensionContext +import org.jetbrains.kotlin.types.model.* import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addToStdlib.UnsafeCastFunction import org.jetbrains.kotlin.utils.addToStdlib.castAll @@ -36,7 +33,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.castAll class FirExpectActualMatchingContext( private val actualSession: FirSession, private val scopeSession: ScopeSession -) : ExpectActualMatchingContext>, TypeSystemInferenceExtensionContext by actualSession.typeContext { +) : ExpectActualMatchingContext>, TypeSystemContext by actualSession.typeContext { override val shouldCheckReturnTypesOfCallables: Boolean get() = false diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt index 388ccfb14d2..59e52ff08c5 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt @@ -28,14 +28,14 @@ import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.types.TypeCheckerState import org.jetbrains.kotlin.types.TypeSystemCommonBackendContext import org.jetbrains.kotlin.types.Variance -import org.jetbrains.kotlin.ir.types.makeNotNull as irMakeNotNull -import org.jetbrains.kotlin.ir.types.makeNullable as irMakeNullable -import org.jetbrains.kotlin.ir.types.isMarkedNullable as irIsMarkedNullable import org.jetbrains.kotlin.types.model.* +import org.jetbrains.kotlin.utils.compactIfPossible import org.jetbrains.kotlin.utils.memoryOptimizedFilterIsInstance import org.jetbrains.kotlin.utils.memoryOptimizedMap -import org.jetbrains.kotlin.utils.compactIfPossible +import org.jetbrains.kotlin.ir.types.isMarkedNullable as irIsMarkedNullable import org.jetbrains.kotlin.ir.types.isPrimitiveType as irTypePredicates_isPrimitiveType +import org.jetbrains.kotlin.ir.types.makeNotNull as irMakeNotNull +import org.jetbrains.kotlin.ir.types.makeNullable as irMakeNullable interface IrTypeSystemContext : TypeSystemContext, TypeSystemCommonSuperTypesContext, TypeSystemCommonBackendContext { @@ -589,6 +589,26 @@ interface IrTypeSystemContext : TypeSystemContext, TypeSystemCommonSuperTypesCon override fun KotlinTypeMarker.isTypeVariableType(): Boolean { return false } + + override fun typeSubstitutorByTypeConstructor(map: Map): TypeSubstitutorMarker { + val typeParameters = mutableListOf() + val typeArguments = mutableListOf() + for ((key, value) in map) { + typeParameters += key as IrTypeParameterSymbol + typeArguments += value as IrTypeArgument + } + return IrTypeSubstitutor(typeParameters, typeArguments, irBuiltIns) + } + + override fun createEmptySubstitutor(): TypeSubstitutorMarker { + return IrTypeSubstitutor(emptyList(), emptyList(), irBuiltIns) + } + + override fun TypeSubstitutorMarker.safeSubstitute(type: KotlinTypeMarker): KotlinTypeMarker { + require(this is AbstractIrTypeSubstitutor) + require(type is IrType) + return substitute(type) + } } fun extractTypeParameters(parent: IrDeclarationParent): List { diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/ExpectActualMatchingContext.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/ExpectActualMatchingContext.kt index e53c9113e88..8319d710137 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/ExpectActualMatchingContext.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/ExpectActualMatchingContext.kt @@ -15,9 +15,9 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.model.TypeSubstitutorMarker -import org.jetbrains.kotlin.types.model.TypeSystemInferenceExtensionContext +import org.jetbrains.kotlin.types.model.TypeSystemContext -interface ExpectActualMatchingContext : TypeSystemInferenceExtensionContext { +interface ExpectActualMatchingContext : TypeSystemContext { val shouldCheckReturnTypesOfCallables: Boolean val RegularClassSymbolMarker.classId: ClassId diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/ClassicExpectActualMatchingContext.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/ClassicExpectActualMatchingContext.kt index edcec819b5d..f943a8c1659 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/ClassicExpectActualMatchingContext.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/multiplatform/ClassicExpectActualMatchingContext.kt @@ -22,17 +22,14 @@ import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.checker.* -import org.jetbrains.kotlin.types.model.KotlinTypeMarker -import org.jetbrains.kotlin.types.model.TypeConstructorMarker -import org.jetbrains.kotlin.types.model.TypeSubstitutorMarker -import org.jetbrains.kotlin.types.model.TypeSystemInferenceExtensionContext +import org.jetbrains.kotlin.types.model.* import org.jetbrains.kotlin.types.typeUtil.asTypeProjection import org.jetbrains.kotlin.utils.addToStdlib.UnsafeCastFunction import org.jetbrains.kotlin.utils.addToStdlib.castAll import org.jetbrains.kotlin.utils.keysToMap class ClassicExpectActualMatchingContext(val platformModule: ModuleDescriptor) : ExpectActualMatchingContext, - TypeSystemInferenceExtensionContext by ClassicTypeSystemContextForCS(platformModule.builtIns, KotlinTypeRefiner.Default) + TypeSystemContext by ClassicTypeSystemContextForCS(platformModule.builtIns, KotlinTypeRefiner.Default) { override val shouldCheckReturnTypesOfCallables: Boolean get() = true diff --git a/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt b/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt index 999b73accd0..afc9816b985 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt @@ -227,12 +227,6 @@ interface TypeSystemInferenceExtensionContext : TypeSystemContext, TypeSystemBui fun CapturedTypeMarker.typeParameter(): TypeParameterMarker? fun CapturedTypeMarker.withNotNullProjection(): KotlinTypeMarker - fun typeSubstitutorByTypeConstructor(map: Map): TypeSubstitutorMarker - fun createEmptySubstitutor(): TypeSubstitutorMarker - - fun TypeSubstitutorMarker.safeSubstitute(type: KotlinTypeMarker): KotlinTypeMarker - - fun TypeVariableMarker.defaultType(): SimpleTypeMarker fun createTypeWithAlternativeForIntersectionResult( @@ -552,6 +546,14 @@ interface TypeSystemContext : TypeSystemOptimizationContext { fun substitutionSupertypePolicy(type: SimpleTypeMarker): TypeCheckerState.SupertypesPolicy fun KotlinTypeMarker.isTypeVariableType(): Boolean + + fun typeSubstitutorByTypeConstructor(map: Map): TypeSubstitutorMarker + fun createEmptySubstitutor(): TypeSubstitutorMarker + + /** + * @returns substituted type or [type] if there were no substitution + */ + fun TypeSubstitutorMarker.safeSubstitute(type: KotlinTypeMarker): KotlinTypeMarker } enum class CaptureStatus {