From af0df35623e8cbe08c4d13071e172794e0c4ea08 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Wed, 26 Aug 2020 13:33:39 +0300 Subject: [PATCH] [NI] Get rid of FE 1.0 types in ConstraintInjector --- .../ConeConstraintSystemUtilContext.kt | 4 ++++ .../resolve/inference/InferenceComponents.kt | 3 +-- .../jetbrains/kotlin/frontend/di/injection.kt | 2 +- .../ClassicConstraintSystemUtilContext.kt | 10 +++++++++- .../components/ConstraintInjector.kt | 20 +++++++++---------- .../components/ConstraintSystemUtilContext.kt | 1 + 6 files changed, 25 insertions(+), 15 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/ConeConstraintSystemUtilContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/ConeConstraintSystemUtilContext.kt index 0b6b9c09fff..5d73662b942 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/ConeConstraintSystemUtilContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/ConeConstraintSystemUtilContext.kt @@ -31,4 +31,8 @@ object ConeConstraintSystemUtilContext : ConstraintSystemUtilContext { // TODO return false } + + override fun KotlinTypeMarker.refineType(): KotlinTypeMarker { + return this + } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceComponents.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceComponents.kt index d2bb9163331..c4ec0cb66b4 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceComponents.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/InferenceComponents.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.resolve.calls.inference.components.ResultTypeResolve import org.jetbrains.kotlin.resolve.calls.inference.components.TrivialConstraintTypeInferenceOracle import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintSystemImpl import org.jetbrains.kotlin.types.AbstractTypeApproximator -import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner class InferenceComponents( val ctx: ConeInferenceContext, @@ -27,7 +26,7 @@ class InferenceComponents( val approximator: AbstractTypeApproximator = object : AbstractTypeApproximator(ctx) {} val trivialConstraintTypeInferenceOracle = TrivialConstraintTypeInferenceOracle.create(ctx) private val incorporator = ConstraintIncorporator(approximator, trivialConstraintTypeInferenceOracle, ConeConstraintSystemUtilContext) - private val injector = ConstraintInjector(incorporator, approximator, KotlinTypeRefiner.Default) + private val injector = ConstraintInjector(incorporator, approximator) val resultTypeResolver = ResultTypeResolver(approximator, trivialConstraintTypeInferenceOracle) @set:PrivateForInline diff --git a/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt b/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt index b70d49fde31..e55b0f295f5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt @@ -101,7 +101,7 @@ private fun StorageComponentContainer.configurePlatformIndependentComponents() { useImpl() useImpl() - useInstance(ClassicConstraintSystemUtilContext) + useImpl() useInstance(ProgressManagerBasedCancellationChecker) } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ClassicConstraintSystemUtilContext.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ClassicConstraintSystemUtilContext.kt index 11b50456743..5e153a529ea 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ClassicConstraintSystemUtilContext.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ClassicConstraintSystemUtilContext.kt @@ -9,11 +9,13 @@ import org.jetbrains.kotlin.resolve.calls.components.CreateFreshVariablesSubstit import org.jetbrains.kotlin.resolve.calls.inference.model.NewTypeVariable import org.jetbrains.kotlin.resolve.calls.inference.model.TypeVariableFromCallableDescriptor import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.model.TypeVariableMarker +import org.jetbrains.kotlin.types.refinement.TypeRefinement import org.jetbrains.kotlin.types.typeUtil.unCapture as unCaptureKotlinType -object ClassicConstraintSystemUtilContext : ConstraintSystemUtilContext { +class ClassicConstraintSystemUtilContext(val kotlinTypeRefiner: KotlinTypeRefiner) : ConstraintSystemUtilContext { override fun TypeVariableMarker.shouldBeFlexible(): Boolean { return this is TypeVariableFromCallableDescriptor && this.originalTypeParameter.shouldBeFlexible() } @@ -32,4 +34,10 @@ object ClassicConstraintSystemUtilContext : ConstraintSystemUtilContext { if (this !is TypeVariableFromCallableDescriptor) return false return originalTypeParameter.isReified } + + @OptIn(TypeRefinement::class) + override fun KotlinTypeMarker.refineType(): KotlinTypeMarker { + require(this is KotlinType) + return kotlinTypeRefiner.refineType(this) + } } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector.kt index bb47520f396..91d884ea54c 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintInjector.kt @@ -20,17 +20,17 @@ package org.jetbrains.kotlin.resolve.calls.inference.components import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemOperation import org.jetbrains.kotlin.resolve.calls.inference.model.* import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintKind.* -import org.jetbrains.kotlin.types.* -import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner +import org.jetbrains.kotlin.types.AbstractTypeApproximator +import org.jetbrains.kotlin.types.AbstractTypeChecker +import org.jetbrains.kotlin.types.AbstractTypeCheckerContext +import org.jetbrains.kotlin.types.TypeApproximatorConfiguration import org.jetbrains.kotlin.types.model.* -import org.jetbrains.kotlin.types.refinement.TypeRefinement import org.jetbrains.kotlin.utils.SmartList import kotlin.math.max class ConstraintInjector( val constraintIncorporator: ConstraintIncorporator, - val typeApproximator: AbstractTypeApproximator, - val kotlinTypeRefiner: KotlinTypeRefiner + val typeApproximator: AbstractTypeApproximator ) { private val ALLOWED_DEPTH_DELTA_FOR_INCORPORATION = 1 @@ -175,12 +175,9 @@ class ConstraintInjector( return baseContext.prepareType(type) } - @OptIn(TypeRefinement::class) override fun refineType(type: KotlinTypeMarker): KotlinTypeMarker { - return if (type is KotlinType) { - kotlinTypeRefiner.refineType(type) - } else { - type + return with(constraintIncorporator.utilContext) { + type.refineType() } } @@ -200,12 +197,13 @@ class ConstraintInjector( if (!isSubtypeOf(upperType)) { // todo improve error reporting -- add information about base types - if (shouldTryUseDifferentFlexibilityForUpperType && upperType is SimpleType) { + if (shouldTryUseDifferentFlexibilityForUpperType && upperType.isSimpleType()) { /* * Please don't reuse this logic. * It's necessary to solve constraint systems when flexibility isn't propagated through a type variable. * It's OK in the old inference because it uses already substituted types, that are with the correct flexibility. */ + require(upperType is SimpleTypeMarker) val flexibleUpperType = createFlexibleType(upperType, upperType.withNullability(true)) if (!isSubtypeOf(flexibleUpperType)) { c.addError(NewConstraintError(lowerType, flexibleUpperType, position)) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintSystemUtilContext.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintSystemUtilContext.kt index 53b909496eb..0e779039ac9 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintSystemUtilContext.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintSystemUtilContext.kt @@ -18,4 +18,5 @@ interface ConstraintSystemUtilContext { fun TypeVariableMarker.hasOnlyInputTypesAttribute(): Boolean fun KotlinTypeMarker.unCapture(): KotlinTypeMarker fun TypeVariableMarker.isReified(): Boolean + fun KotlinTypeMarker.refineType(): KotlinTypeMarker }