From 623019cff1abb28759c9169ff3055ed14ed084d8 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 16 May 2023 14:00:10 +0300 Subject: [PATCH] [FE] Move substitutor related methods to TypeSystemContext Also use TypeSystemContext instead of TypeSystemInferenceExtensionContext in AbstractExpectActualCompatibilityChecker This is needed to have an ability to implement ExpectActualMatchingContext for IR backend. IrTypeSystemContext may operate with type substitutors, but there is no sense to implement all methods from TypeSystemInferenceExtensionContext in it --- .../mpp/FirExpectActualMatchingContext.kt | 7 ++--- .../kotlin/ir/types/IrTypeSystemContext.kt | 28 ++++++++++++++++--- .../calls/mpp/ExpectActualMatchingContext.kt | 4 +-- .../ClassicExpectActualMatchingContext.kt | 7 ++--- .../kotlin/types/model/TypeSystemContext.kt | 14 ++++++---- 5 files changed, 38 insertions(+), 22 deletions(-) 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 {